私は、このトピックについて多くの質問があることを知っています。今、私は別の問題に遭遇しましたが、私自身も同僚も、奇妙な動作の理由が何であるかを知りません.
次のような比較的単純な SQL ステートメントがあります。
SELECT
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
SomeOtherColumn,
...
FROM
MyTable
INNER JOIN MyOtherTable
ON MyTable.ID = MyOtherTable.MyTableID
WHERE
MyTable.ID > SomeValue AND
MyText LIKE 'Date: %'
これは私のデータベースではなく、私の SQL ステートメントでもありません。また、日時の値を varchar 列に格納する優れたスキーマを作成していないため、その部分は無視してください。
現在直面している問題は、SQL 変換エラー 241 (「文字列から日付や時刻を変換するときに変換に失敗しました。」) です。
これで、クエリ オプティマイザーが、変換の試行後に WHERE 句を使用して結果をフィルター処理する実行計画を変更する可能性があることがわかりましたが、本当に奇妙なことは、すべての WHERE 句を削除してもエラーが発生しないことです。 .
上記のステートメントに次のように 1 行追加しても、エラーは発生しません。
SELECT
MyText, -- This is the added line
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
...
削除するとすぐに、変換エラーが再び発生します。MyText 列の値を変換せずに手動でチェックしても、問題を引き起こす可能性のあるレコードがあることは示されません。
変換エラーの原因は何ですか? SELECT ステートメントの一部として列を選択しても、なぜそれに遭遇しないのですか?
アップデート
ここに実行計画がありますが、役に立たないと思います。