1

「日付や時刻を文字列から変換する際に変換に失敗しました」というエラーメッセージについて、20件ほど検索しました。そして、誰も私の問題に対処していないようです。

ちょっとした歴史ですが、先週の金曜日、クエリは問題なく機能し、返されたデータは適切でした。次の月曜日に、クエリが機能しなくなり、「文字列から日付および/または時刻を変換するときに変換に失敗しました」というエラー メッセージが表示されました。そのため、数時間の戦いの後、問題のあるコードを含む関数を実行することができ、クエリは再び完全に実行されました. 今朝まで。オフィスに来てクエリを実行すると、「文字列から日付や時刻を変換するときに変換に失敗しました」というエラーが表示されました。だから今、私は髪を引っ張っています。

まず、返される各レコードが実際に有効な日付であることを isDate 関数を使用して検証することから始めました。すべての日付は、文字列形式の有効な日付です。記録が 1 年以上経過しているかどうかを確認しているだけです。

私はいくつかの INNER JOINS を持っていますが、それらが出力に影響を与えているかどうか疑問に思っていました。

SELECT 
gc2p.partnumber, gc2p.orderby, gc2p.campaigncode, gp2a.assetfilename
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2productrefs] gc2p
,[StepMirror].[dbo].[stepview_nwppck_ngn_getpimweblegalattrlist1] gpwa
,[StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a 
,[StepMirror].[dbo].[stepview_nwppck_ngn_getproduct2assetrefs] gp2a 
WHERE gc2p.partnumber=gpwa.PARTNUMBER and
gc2p.id=gc2a.id and
gp2a.PRODUCTNAME=gpwa.PARTNUMBER and
ATTRIBUTENAME='New Date' AND 
ATTRIBUTEVALUE > dateadd(month,-12,getdate()) AND 
gc2p.id = '5665976' and 
gc2a.assettype='Primary Image' AND 
gp2a.ASSETTYPE = 'Primary Image'
order by gc2p.orderby

誰かが私に助けの手を差し伸べてくれたら、それは素晴らしいことです。

編集:「ATTRIBUTEVALUE > dateadd(month,-12,getdate())」を削除すると、クエリは正常に実行されます。エラーをスローするクエリの正確な部分について言及するのを忘れていました。

編集:更新されたクエリ -同様の回答を求めている人のための現在の作業クエリ。

SELECT TOP 18 gc2p.partnumber, gpwa.ATTRIBUTECNAME,gp2a.ASSETFILENAME, gpwa.ATTRIBUTEVALUE
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2productrefs] gc2p
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getpimweblegalattrlist1] gpwa ON gc2p.partnumber=gpwa.PARTNUMBER and gpwa.ORDERBY='96'
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a ON gc2p.id=gc2a.id
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getproduct2assetrefs] gp2a ON gc2p.partnumber=gp2a.PRODUCTNAME
WHERE gc2p.id = 5665976 AND gp2a.assettype='Primary Image' AND gc2a.assettype='Primary Image' 
AND(CASE WHEN ISDATE(ATTRIBUTEVALUE)  = 0 then NULL ELSE ATTRIBUTEVALUE END) > dateadd(month,-12,getdate())
order by gc2p.orderby
4

2 に答える 2

2

この問題は、ATTRIBUTEVALUE フィールドに日付以外のデータが含まれている可能性があります。を含めるとフィルター処理されると想定していますATTRIBUTENAME='New Date'が、クエリプランによってはそうではない場合があります。試す...

(CASE WHEN ISDATE(ATTRIBUTEVALUE) = 0 then NULL ELSE ATTRIBUTEVALUE END) > dateadd(month,-12,getdate()) AND ...

ATTRIBUTEVALUE複雑な結合では、SQL エンジンが最初にテーブルを結合してからフィルターを使用することを決定する場合があります。これにより、 のすべてのインスタンスが暗黙的に日付に変換されるとは限らず、不一致が発生します。

また、コンマ結合ではなく、実際の SQL 結合を使用してください。それは悪い形であり、解決するよりもはるかに多くの問題を引き起こします.

于 2012-11-07T20:32:30.857 に答える
0

それが何であれ、クエリがそれとは何の関係もないことを確認してください。テーブル内のデータがすべてです。また、クエリを見たように、いくつかのビューに参加しているようで、ビュー定義内にこのエラーを引き起こすいくつかの変換がある可能性があります。もし私がどこにいても、エラー参照が見つかるまで、テーブルに対していくつかの簡単なクエリを実行し、文字列列を 1 つずつ datetime に変換します。

それが役に立てば幸い。

乾杯

于 2012-11-07T20:31:32.900 に答える