1

下面是我们用来在 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;
4

2 回答 2

2

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

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

对此:

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

sproc 现在可以工作了。

于 2012-11-06T20:40:36.870 回答
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
                       )    
于 2012-11-06T20:41:12.007 回答