Tsql 将空datetime值插入SQL表

Tsql 将空datetime值插入SQL表,tsql,datetime,null,Tsql,Datetime,Null,下面是我们用来填充SQL数据库中的表的存储过程。@expDate是从C#批处理作业发送的参数,该作业从Excel和电子表格获取其值 如果当前代理的培训处于活动状态,则电子表格的“过期日期”单元格中将没有值。这将导致从C#代码向存储过程发送一个空字符串,然后将其转换为日期时间值1900-01-01。在我需要使用游标将新记录插入表之前,这是可以接受的 如果@expDate值是1900-01-01,那么我需要SQL记录的到期日期字段中的值为NULL。但是,我不能将@expDate=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;

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

IF @flag = '1' SET @expDate = ''
为此:

IF @flag = '1' SET @expDate = NULL
这场狂欢现在开始了

这样行吗

                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
                       )    

“我不能将@expDate=NULL设置为空,也不能将其设置为空(“”)”。为什么不呢?这是一个业务规则,一个空白值会将列设置为1900-01-01(刚刚编辑)一个业务规则?关于实现细节???如果需要将字段的值设置为
null
(您声明需要),将变量设置为
null
有什么问题?业务从何而来?它是一个日期时间字段。不能将变量值设置为“NULL”或datetime以外的任何值,否则它将不起作用。您将收到以下错误消息:“从字符串转换日期和/或时间时,转换失败。”您将如何设置它?如果您使用的是
'NULL'
,那就错了-这是字符串
NULL
。您需要传入实际的
NULL
(您在合并中所做的是错误的)。