Создание представления SQL Server для жизненного цикла продукта - PullRequest
2 голосов
/ 16 августа 2011

[Отказ от ответственности]: В настоящее время мы работаем с более старой версией SQL Server 2000, но мы можем обновить ее до SQL Server 2008 в течение следующих 6 месяцев или около того.

В нашей производственной среде у меня есть очень длинный фрагмент кода C #, чтобы определить следующее:

  1. Какой сотрудник "владеет" продуктом (определяется как первый сотрудник, который над ним работает),

  2. Что это за возможный продукт Test_Result на станции Проверка давления , и

  3. То, что первый продукт этого Test_Result находится на Вакуумный тест станции.

Все значения Test_Result (хранящиеся в строковых значениях) содержатся в плоской файловой таблице, созданной на основе более старой электронной таблицы Microsoft Excel. Структура базы данных не может быть легко изменена, поскольку машины компании и машины поставщиков записывают в них данные.

Раз в месяц или около того, руководство запускает отчет, чтобы отобразить, сколько продуктов принадлежит каждому сотруднику, если первый тест давления прошел успешно, и если возможно Вакуумный тест прошел успешно.

В настоящее время моя техника для этого заключается в SQL звонках с C# код:

  • SELECT DISTINCT Serial_Number WHERE Date_Time BETWEEN @Date1 AND @Date2

В течение месяца мы могли регистрировать в любом месте от 1500 до 3500 различных продуктов Serial_Number значений.

Для каждого Serial_Number я создаю экземпляр пользовательского класса Product, который содержит PressureEmployee и VacuumEmployee, оба инициализированы в NULL.

  • Теперь для каждого из этих Product экземпляров я выбираю все данные и порядок в поле Date_Time, чтобы определить, какой сотрудник выполнил сначала тестовые действия с продуктом.

SQL для этого похож на следующий квази-код:

string sqlText = "SELECT Date_Time, Employee, System_ID, Test_Result " +
  "FROM Production " +
  "WHERE Serial_Number=@SN ORDER BY Date_Time";
using (SqlCommand cmd = new SqlCommand(sqlText, new SqlConnection(connStr))) {
  cmd.Parameters.Add("@SN", SqlDbType.NVarChar, 20);
  cmd.Connection.Open();
  foreach (var item in productList) {
    cmd.Parameters["@SN"].Value = item;
    SqlDataReader r = cmd.ExecuteReader();
    while (r.Read()) {
      string systemId = r["System_ID"].ToString();
      string testResult = r["Test_Result"].ToString();
      if (-1 < systemId.IndexOf("pressure")) {
        if (String.IsNullOrEmpty(item.PressureEmployee)) {
          item.PressureEmployee = r["Employee"].ToString();
        }
        // check that product ever passes
        if (-1 < testResult.IndexOf("pass")) {
          item.VacuumPass = true;
        }
      }
      if ((-1 < systemId.IndexOf("vacuum")) &&
          String.IsNullOrEmpty(item.VacuumEmployee)) {
        item.VacuumEmployee = r["Employee"].ToString();
        // product passes 1st time
        item.VacuumPass = (-1 < testResult.IndexOf("pass"));
      }
    }
  }
}

На самом деле это намного больше, но оно должно дать общее представление.

Что я хотел бы сделать, это создать представление, которое может находиться на Сервере, которое просто содержит список каждого Serial_Number, результата Pressure_Test, даты Pressure_Test, результата Vacuum_Test и Vacuum_Test дата.

Если мое мышление будет правильным, это приведет к меньшему количеству работы на сервере, потому что он будет поддерживать это представление всегда. Кроме того, представление должно выполняться намного быстрее ... верно?

Итак, как бы я написал такой взгляд?

Если это не быстрее, есть ли способ получить статус запроса во время его выполнения? Отображение Cursor = Cursors.WaitCursor в течение 40 минут не вселяет большую уверенность в моем приложении.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Не совсем - по умолчанию представления не поддерживаются SQL Server - представления - это просто фрагменты операторов SQL, которые будут включены в ваш запрос.Никакого прироста производительности здесь .....

Вы можете исследовать индексированных представлений , которые действительно "поддерживаются" в том смысле, что их значения данных хранятся на диске - как таблица.

Они имеют длинный список для стиркитребований и ограничений - но если вы их сопоставите, это может быть немного быстрее - за счет использования большего дискового пространства.У вас здесь тоже нет бесплатных обедов ...

1 голос
/ 16 августа 2011

Если вы хотите передать параметры, вам может быть полезнее хранимая процедура, чем представление.

CREATE PROCEDURE dbo.myProc
(@SN int)
AS
BEGIN
   SELECT 
      Date_Time, 
      Employee, 
      System_ID, 
      Test_Result,
      CASE WHEN CHARINDEX('Pressure', System_ID) > 0 THEN Employee ELSE '' END as PressureEmployee,
      CASE WHEN CHARINDEX('pass', Test_Result) > 0 THEN 1 ELSE 0 END as VacuumPass
   FROM Production
   WHERE Serial_Number = @SN 
   ORDER BY Date_Time
END

Ваш C # может прекрасно с этим работать (вместо sqltext вы будете использовать sqlcommand).

...