将null datetime值INSERT到SQL表中

时间:2012-11-06 20:17:38

标签: tsql datetime null

下面是我们用来填充SQL数据库中的表的存储过程。 @expDate是一个从C#批处理作业发送的参数,它从Excel电子表格中获取它的值。

如果当前代理的培训处于活动状态,则电子表格在到期日期单元格中将没有值。这会导致从C#代码将空字符串发送到存储过程,然后将其转换为日期时间值1900-01-01。这很好,直到我需要使用游标将新记录插入表中。

如果@expDate值为1900-01-01,那么我需要SQL记录的到期日期字段中的值为NULL。但是,我无法设置@expDate = NULL,也不能将其设置为空白('')[编辑:由于业务规则,我无法设置为空白。空白值将使字段的值设置为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;

2 个答案:

答案 0 :(得分:2)

通过遵循Oded的注释,我摆脱了COALESCE语句并将@flag值设置为NULL而不是NULL。通过更改此行代码:

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

到此:

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

现在可以使用。

答案 1 :(得分: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
                       )