2012-11-06 3 views
1

Ниже приведена хранимая процедура, используемая для заполнения таблицы в базе данных SQL. @expDate - это параметр, который отправляется из пакетного задания C#, которое получает его значения из электронной таблицы Excel.INSERT Значение null datetime в таблице SQL

Если тренировка для текущего агента активна, электронная таблица не будет иметь значение в ячейке даты истечения срока действия. Это приводит к отправке пустой строки в хранимую процедуру из кода C#, который затем преобразуется в значение datetime 1900-01-01. Это хорошо до тех пор, пока я не буду вставлять новые записи в таблицу с помощью курсора.

Если значение @expDate равно 1900-01-01, мне нужно, чтобы значение в поле даты истечения срока записи SQL было NULL. Тем не менее, я не могу установить @expDate = NULL и не могу просто установить его в пустую ('') [EDIT: я не могу установить пустой из-за бизнес-правила. Пустое значение приведет к тому, что значение поля будет установлено в 1900-01-01]. Какие-либо предложения?

DECLARE @date datetime = GETDATE() 
    IF @expDate = '1900-01-01' SET @flag = '1' 
    IF @expDate = '1900-01-01' SET @expDate = GETDATE() 

    DECLARE prod_cursor CURSOR LOCAL SCROLL FOR 
    SELECT ProductCode 
    FROM CourseToProduct 
    WHERE CourseCode = @courseCode and (TerminationDate >= @expDate OR TerminationDate IS NULL) 

    IF @flag = '1' SET @expDate = '' 

    OPEN prod_cursor 

    FETCH NEXT FROM prod_cursor 
    INTO @productCode 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF NOT EXISTS 
     (
     SELECT * 
     FROM AgentProductTraining 
     WHERE @sNumber = SNumber and 
       @courseCode = CourseCode and 
       @productCode = ProductCode and 
       @dateTaken = DateTaken 
     ) 
     BEGIN 
      IF @sNumber IS NOT NULL 
      BEGIN 
       INSERT INTO AgentProductTraining 
          (
          SNumber, 
          CourseCode, 
          ProductCode, 
          DateTaken, 
          DateExpired, 
          LastChangeOperator, 
          LastChangeDate 
          ) 
       VALUES  (
          @sNumber, 
          @courseCode, 
          @productCode, 
          @dateTaken, 
          COALESCE(@expDate, 'NULL'), 
          @lastChangeOperator, 
          @lastChangeDate 
          )  
      END 
     END 

     FETCH NEXT FROM prod_cursor 
     INTO @productCode 
    END 
    CLOSE prod_cursor; 
    DEALLOCATE prod_cursor; 
+0

«Я не могу установить @expDate = NULL, и я не могу просто установить его в пустую ('')". Почему нет? – Oded

+0

Это бизнес-правило, пустое значение установит столбец в 1900-01-01 (только что сделанное редактирование) – NealR

+0

Бизнес-правило? Для детализации реализации ??? Если вам нужно установить значение поля в значение «null» (что вам нужно указать), в чем проблема с установкой переменной в «null»? Где в нее входит бизнес? – Oded

ответ

2

Следуя комментарии Одед, я избавилась от заявления COALESCE и установите значение @flag в NULL в противоположность NULL. При изменении этой строки кода:

IF @flag = '1' SET @expDate = '' 

к этому:

IF @flag = '1' SET @expDate = NULL 

sproc теперь работает.

1

Будет ли это работать?

   INSERT INTO AgentProductTraining 
         (
         SNumber, 
         CourseCode, 
         ProductCode, 
         DateTaken, 
         DateExpired, 
         LastChangeOperator, 
         LastChangeDate 
         ) 
      VALUES  (
         @sNumber, 
         @courseCode, 
         @productCode, 
         @dateTaken, 
         CASE WHEN @expDate = '1900-01-01' THEN Null ELSE @expDate END, 
         @lastChangeOperator, 
         @lastChangeDate 
         )  
Смежные вопросы