我知道有很多關於這個話題的問題,甚至有一個我剛纔問自己(here)。現在我遇到了另一個問題,我和我的同事都不知道這個奇怪行爲的原因是什麼。爲什麼我在TSQL中遇到DATETIME轉換錯誤?
我們已經有了一個相對簡單的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子句。
我還當我一個行添加到上面的語句如下沒有得到任何錯誤:
SELECT
MyText, -- This is the added line
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
...
當我刪除它,我再次得到了轉換錯誤。手動檢查MyText列中的值而不嘗試轉換它們並不表明存在可能導致問題的任何記錄。
轉換錯誤的原因是什麼?爲什麼我在選擇列作爲SELECT語句的一部分時不會遇到它?
更新
這裏的執行計劃,但我不認爲它會幫助你。
當你運行查詢時'第一行'的myText列的值是什麼'子句? – Kaf 2013-03-05 11:05:23
爲什麼''CHARINDEX('Date:',MyText)''當'LIKE'子句保證'MyText' *以'Date:'開頭*? – 2013-03-05 11:09:16
@Kaf:數據類似於: Ping未達到11.22.33.44:11.22.33.44爲0%可達1.嘗試日期:31.12.2000 12:34:56 IP:11.22.33.44 這不是我的東西產生這一點。 – Gorgsenegger 2013-03-05 12:13:54