1

文字列として渡される日時パラメータを受け取るストアド プロシージャがあります。このような:

手順:

CREATE PROCEDURE [dbo].[MyFancySP]
   @MyStartDate datetime = NULL,
   @MyEndDate datetime = NULL
AS
....

電話:

EXEC [dbo].[MyFancySP]
   @MyStartDate = N'01/01/2012',
   @MyEndDate = N'03/01/2012'

ストアド プロシージャは、ずっとこのように機能してきました。さて、ここが興味深い部分です。日付を 2012 年 3 月 27 日またはそれ以降に変更するとすぐに、次のエラーが表示されます。

日付が使用されるストアド プロシージャ内の唯一の場所は、where 句です。関係がある場合は、ここにもコピーします。

WHERE
((@MyStartDate IS NOT NULL AND @MyEndDate IS NOT NULL 
AND d.SomeDate >= @MyStartDate AND d.SomeDate <= @MyEndDate) 
OR @MyStartDate IS NULL AND @MyEndDate IS NULL)

3 月 27 日以降に範囲外の例外が発生する理由はありますか? ちなみに、これはSQL Server 2008 R2で実行されています。

ありがとう!

4

2 に答える 2

2

新しいデータベース接続ごとに次を実行します。

SET DATEFORMAT DMY

これを行うと、問題は解消されます。あなたの問題は、サーバーのロケールの組み合わせと、月の日が 13 日から 31 日かどうかによって条件付けられていると思われます。

エラーが表示されるだけでなく、気付かないうちに誤った期間のデータを取得している可能性もあります。ソフトウェアの他のレイヤーがそれを修正している可能性がありますが、場合によってはのみかもしれません.

于 2012-04-19T16:28:58.883 に答える
1

は何型d.SomeDateですか?ひょっとしてNVARCHARですか?そのような場合、 WHERE 句には、データ型の優先順位のルールがDATETIME. クエリがフィールドに無効な日付を含む行をスキャンするという単純な事実が原因で、エラーの明らかなランダム性が発生しますd.SomeDate。このような場合、データの純度の問題に対処しているため、できれば列を DATETIME にして、テーブルを修正する必要があります。

加えて:

  • 文字列表現では常に正規の日付形式YYYYMMMDD(区切り記号なし) を使用します: EXEC [dbo].[MyFancySP] N'20120101', N'20120301';. この形式は、ホスト ロケール、DATEFORMAT、および LANGUAGE の設定とは無関係です。

  • T-SQL の動的検索条件を読み取ります。WHERE column=@value or @value is nullクエリ パフォーマンスの最適化を途中で止めます。記事を読む。

于 2012-04-19T17:40:43.173 に答える