1

デフォルト値が NULL の DateTime パラメータを受け入れる SQL ストアド プロシージャがあります。

@pmNext_Check_Date DATETIME=NULL

このパラメーターを 3 つのシナリオで使用したいと考えています。

  1. NULL の場合、レコードを更新しない
  2. 日付値がある場合は、WHERE 句で指定されたすべてのレコードを更新します
  3. 問題の1つ!クエリのすべての日付フィールドを WHERE 句のレコードに対して NULL に設定します。

問題を引き起こしている SP 内のコード ブロックは次のとおりです (UPDATE ステートメントの残りの部分は SP の別の場所でビルドされ、正常に動作します)。

IF @pmNext_Check_Date IS NOT NULL
    IF @pmNext_Check_Date ='' --This is the bit that is causing me a problem. I just need to check for a empty date
        SET @sql = @sql + ' Next_Check_Date = NULL '
    ELSE
        SET @sql = @sql + ' Next_Check_Date = @pmNext_Check_Date '                    

SET @sql = @sql + ' WHERE ID IN (1, 2)'

たとえば、次の 2 行があるとします。

ID NextCheckDate

1 12/12/12

2ヌル

シナリオ 1 では、プロシージャが既定値を使用し、日付が更新されないため、パラメーターを渡しません。

シナリオ 2 では、日付値を渡し、両方の行を日付値で更新します

シナリオ 3 では、行の日付値を null に更新したいと考えています。シナリオ 1 と 3 の違いは、ユーザーが日付値を null に設定することを選択するシナリオ 3 にあります。

そこで、空の日付をストアド プロシージャに渡したいと思いました。私はC#からこれを行っており、次のようなことをしたいと思います:

SqlParameter param = new SqlParameter("@pmNext_Check_Date", "");                            

SP が DateTime を予期しているため、これは失敗します。

したがって、空白の日付を渡すことができるようにしたいのですが、SP 内でこれを確認するにはどうすればよいですか。以下の現在のチェックは機能しません。

IF @pmNext_Check_Date =''

前もって感謝します。これがすべて理にかなっていることを願っています。C#4.0 と SQL 2008 を使用しています

4

4 に答える 4

7

「空白の日付」なんてものはありません。よく知られているセンチネル値 (たとえば、任意の古い年の 1 月 1 日) を使用することもできますが、そのnullほうが望ましいでしょう。パラメータを介して明示的に渡すにはnull、次のものが必要であることに注意してください。

SqlParameter param = new SqlParameter("@pmNext_Check_Date", DBNull.Value);

それが十分な粒度を持っていない場合はbit、sproc に何をさせたいかを明確にする別の boolean ( ) パラメータ (または同様のもの) を追加することを検討してください。または: これらの異なることを行う複数の proc を用意します。

SQL Server の有用なセンチネル値の 1 つは、1753 年 1 月 1 日 (SQL Server の最小datetime値) です。これは、文字列を として解析せずに TSQL で生成できますcast(-53690 as datetime)

于 2013-01-22T12:25:34.113 に答える
1

申し訳ありませんが、あなたが求めていることを正確に行う方法はありません。DATETIME値はNULLまたは有効な日付のいずれかであり、文字列の場合のように「空」はありません。

もう1つの回避策は、いわゆる空の文字列を表すトークン値(それ以外の場合は有効な日付ではない)を渡すことです。たとえば、私が使用している一般的な文字列はです1900-01-01NULL次に、ストアドプロシージャでと「空」を区別できます。

しかし、これを行うことはまったくお勧めしません。私は他の提案に同意します。別のパラメーターを追加し、ストアドプロシージャでより意味のある方法でロジックを実行します。

于 2013-01-22T14:22:16.457 に答える
1

空の文字列を日時として渡すことはできません。したがって、いくつかのオプションがあります。更新を行うかどうかを示す追加のパラメーターを追加できます。コードの可読性と保守性のための最良のオプションとして、それをお勧めします。もう 1 つのオプションは、パラメーターを文字列として渡して解析することです。そうすれば、空の文字列の概念を使用できます。

SQL Server 文字列から日付への変換

于 2013-01-22T12:15:31.020 に答える
0

私の記憶が正しければ、NULL を許可するDATETIMEデータ型の列は、 デフォルトで空白値ではなく値 1900-01-01 になります

例: NULLSは、ある種のビジネス ロジックに基づいて後で値を受け取る特定の列に許可される場合があります。これらのオープン エンドの列を varchar として保持し、datetime では許可されない何らかの型または空の文字列のカスタム エントリを有効にする人々を見てきました。

あなたが私に尋ねたら、ベース列のデータ型を台無しにしないようにして、それをDATETIMEのままにします。データの取得とレポートの目的で、次のアプローチを試す場合がありますが、これは最善の方法ではない可能性があります。しかし、それは機能します。

BEGIN
            DECLARE @VarcharDateTable TABLE
            ([EndDate_Varchar] varchar(27))

        BEGIN
                INSERT INTO @VarcharDateTable([EndDate_Varchar])
            SELECT 
              CONVERT(varchar(27), [EndDate_Datetime], 121)        
                FROM [dbo].[MainTable]
        END
        BEGIN
        SELECT CASE WHEN [EndDate_Varchar] LIKE '1900-01-01%'
                        THEN 'Data unavailable'--or whatever you want
                        ELSE [EndDate_Varchar]
                   END AS [EndDate_Varchar] FROM @VarcharDateTable
        END 
END  
于 2013-02-15T09:14:57.240 に答える