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 に答える