2017-08-21 15 views
-2
select * 
from abc 
where 
    ((@abcStartDate_From IS NULL AND @abcStartDate_To IS NULL) OR 
    ((StartDate > @LicenseStartDate_From) AND (@abcStartDate_To is NULL)) OR 
    (DATEADD(d, 0, DATEDIFF(d, 0, StartDate)) BETWEEN @abcStartDate_From AND @abcStartDate_To)) 

注日付および/または時刻を変換する際、変換に失敗しました。動的なクエリで文字列のSQL Server 2012から

私は、動的クエリを記述したいが、文字列から日付/時刻を変換する

私は、動的クエリのスクリプトとして以下で使用しているとき

の変換が失敗したエラーを得た:

--('''+(convert(datetime,@abcStartDate_From,110))+''' IS NULL and '''+(convert(datetime,@abcStartDate_To,110))+''' IS NULL )OR  
-- ((convert(datetime,StartDate,110) > '''+(convert(datetime,@abcStartDate_From,110))+''') and ('''+(convert(datetime,@abcStartDate_To,110))+''' is NULL)) OR 
-- (DATEADD(d, 0, DATEDIFF(d, 0, convert(datetime,StartDate,120))) BETWEEN '''+(convert(datetime,@abcStartDate_From,110))+''' and '''+(convert(datetime,@abcStartDate_To,110))+''')' 

((''' + convert(varchar(10), @abcExpirationDate_From, 120) + ''' IS NULL and ''' + convert(varchar(10), @abcExpirationDate_To, 120) + ''' IS NULL )OR 
-- ((A.StartDate > ''' + convert(varchar(10), @abcExpirationDate_From, 120) + ''') and (''' + convert(varchar(10), @abcExpirationDate_To, 120) + ''' is NULL)) OR 
-- (DATEADD(d, 0, DATEDIFF(d, 0, A.ExpiryDate)) BETWEEN ''' + convert(varchar(10), @abcExpirationDate_From, 120) + ''' and ''' + convert(varchar(10), @abcExpirationDate_To, 120) + '''))' 

('''+(convert(nvarchar(10),@abcStartDate_From,111))+''' IS NULL and '''+(convert(nvarchar(10),@abcStartDate_To,111))+''' IS NULL )OR 
    ((convert(nvarchar(10),StartDate,111) > '''+(convert(datetime,@abcStartDate_From,110))+''') and ('''+(convert(nvarchar(10),@abcStartDate_To,111))+''' is NULL)) OR 
    (DATEADD(d, 0, DATEDIFF(d, 0, convert(nvarchar(10),StartDate,111))) BETWEEN '''+(convert(nvarchar(10),@abcStartDate_From,111))+''' and '''+(convert(nvarchar(10),@abcStartDate_To,111))+''')' 

しかし、それは私には役に立たなかった。誰も私がこの問題から出てくるのを助けることができますか?

+0

エラーの原因となっている実際のコードを投稿する必要があります。投稿したクエリは動的ではありません。 –

+0

[動的SQLクエリでの変換に失敗しました]の重複の可能性があります。(https://stackoverflow.com/questions/13805969/conversion-failed-error-with-dynamic-sql-query) –

+0

ジョンは、コード行の前に4つのスペースを置きました。 – KtX2SkD

答えて

0

「変換に失敗しました」というエラーは、変換関数を間違って使用したために発生しました。使用するケースのデータ型が間違っています。 varchar(10)は変換スタイル110に適しています。動的SQLの生成と生成されたSQLの実行の両方でこの問題が発生しました。

あなたの継続する問題は、ダニの数に関係しているようです。文字列は正しく解析されません。この代わりにConsdier(ここでは「選択」のキーワードが出力に意味される生成された文字列は、私たちが正しいのためにそれを確認することができますこれは、最終的な解決策の一部ではありません。):これは、実行される文を(生産

declare @abcStartDate_From datetime = '1/1/2000' 
declare @abcStartDate_To datetime = '12/1/2000' 

select '('''+(convert(varchar(10),@abcStartDate_From,110))+''' IS NULL and '''+(convert(varchar(10),@abcStartDate_To,110))+''' IS NULL) OR  
    ((convert(datetime,StartDate,110) > '''+(convert(varchar(10),@abcStartDate_From,110))+''') and ('''+(convert(varchar(10),@abcStartDate_To,110))+''' is NULL)) OR 
    (DATEADD(d, 0, DATEDIFF(d, 0, convert(datetime,StartDate,120))) BETWEEN '''+(convert(varchar(10),@abcStartDate_From,110))+''' and '''+(convert(varchar(10),@abcStartDate_To,110))+''')' 

これは完全なSQLクエリではないので、where句の一部になるようにします)。

('01-01-2000' IS NULL and '12-01-2000' IS NULL) OR  
    ((convert(datetime,StartDate,110) > '01-01-2000') and ('12-01-2000' is NULL)) OR 
    (DATEADD(d, 0, DATEDIFF(d, 0, convert(datetime,StartDate,120))) BETWEEN '01-01-2000' and '12-01-2000') 

次に、ロジックには多くの問題があります。 @abcStartDate_Fromがnullの場合、変換関数はnullを生成します。 nullを '+'演算子と連結すると、連結の他の文字列に関係なく、結果の文字列がNULLになります。あなたのダイナミックSQLは、変数がnullの場合のケースを処理しているようですが、変数がnullの場合、文字列自体は生成されません。問題を参照してください?動的SQLを生成する前に変数をテストしてから、それらの値が表す異なるケースに基づいて異なるSQLを生成する必要があります。

次:

なぜこのdateaddロジックをやっていますか?次のステートメント:

DATEADD(d, 0, DATEDIFF(d, 0, convert(varchar(10),StartDate,120))) 

はStartDateと同じです。私はそれを行う理由は見ません。

とにかく、助けてください。がんばろう。

関連する問題