2017-01-25 11 views
2

2つのローカル変数を@From datetime and @To datetimeと宣言して、ストアドプロシージャで使用しているdatetimeの型の列を持っていますが、エラーが発生しても、単にストアドプロシージャを実行してもレコードを返さずに(完全に空白)ストアドプロシージャtsqlの日付変換

set @mySql =' 
select * from abc where (MyDATE between '''+ cast(@From as datetime) +''' and '''+ cast(@To as datetime)+''')' 
+1

動的クエリで使用するには、ローカル変数をvarcharにキャストする必要があります。 –

+1

どのようにパラメータを渡していますか?型付きパラメータとして渡すと(これはあなたがすべきことです!)、キャストの必要はありません。 Datetimesは、特に文化/言語設定のためにエラーになりやすいです... – Shnugo

+0

動的なSQLを作成しています。少なくともスニペットを指定すると、これは必ずしも必要ではありません。 – Shnugo

答えて

1

可能な限り、データを適切なタイプの変数に保存してください。

[email protected] and @To are declared previously as datetimes 
set @mySql ='select * from abc where (MyDATE between @From and @To)' 

--Other code that constructs/works on @mySQL 

--Finally, run the dynamic sql: 
EXEC sp_executesql @mySql, 
        '@From datetime,@To datetime`, 
        @From, 
        @To 

をそして、あなたは前後に文字列やdatetime S、及びそのそれら変換する機会を紹介を間に強制していないので、すべてが美しく動作するはずです:

たとえば、ここにあなたが行うことができます書式設定の問題があります。

2

これを行うには唯一の「正しい」方法は、動的SQL内をパラメータとしてそれらを保存することです。たとえば:

set @mySql =N'select * from abc where MyDATE between @from and @to'; 

exec sp_executesql @mySql, N'@from datetime, @to datetime', @fromOuter, @toOuter; 

これは、それらを保持しますが、正しく動的コードを入力し、書式設定の懸念やSQLインジェクションのリスクの両方を回避することができます。上記の例(@from@toは動的コードの名前で、@fromOuter@toOuterは呼び出しコードの名前です)のように、動的コードの内側と外側の名前は一致する必要はありません。

実際に使用するよりも多くのパラメータを渡すかどうかは関係ありません(これは動的フィルタリングの方法ではかなり普通です)。