2013-03-05 92 views
0

我知道有很多關於這個話題的問題,甚至有一個我剛纔問自己(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語句的一部分時不會遇到它?

更新

這裏的執行計劃,但我不認爲它會幫助你。 part1 enter image description here

+0

當你運行查詢時'第一行'的myText列的值是什麼'子句? – Kaf 2013-03-05 11:05:23

+0

爲什麼''CHARINDEX('Date:',MyText)''當'LIKE'子句保證'MyText' *以'Date:'開頭*? – 2013-03-05 11:09:16

+0

@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

回答

1

有時候,SQL Server將積極通過推動轉換操作在過程的早期比他們原本必須優化。 (它不應該在連接上看到SQL Server should not raise illogical errors作爲例子)。

當你只是選擇:

CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) 

然後優化器決定它可以執行這種轉換爲部分表/索引掃描或查找 - 就在在它的閱讀從數據點表(重要的是,在WHERE子句過濾器之前或同時)。查詢的其餘部分可以使用轉換後的值。

當您選擇:

MyText, -- This is the added line 
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) 

它決定讓後來的轉換髮生。重要的是,轉換現在(通過偶然)發生在WHERE子句過濾器後面,它應該通過權限在轉換嘗試之前過濾所有行。


解決此問題的唯一安全方法是在嘗試進行轉換之前強制執行篩選。如果你不處理的骨料,一個CASE表達可能是足夠安全:

SELECT CASE WHEN MyText LIKE 'Date: %' THEN CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) END 

否則,更安全的選擇是將查詢拆分爲兩個單獨的查詢,以及中間結果存儲在臨時表或表變量(視圖,CTE和子查詢不計算在內,因爲優化器可以「看透」這樣的結構)

+0

謝謝,這就是我在上面提到的其他問題的答案中所描述的內容。但是,當我根本不使用WHERE子句時,則我**不會**錯誤。這很奇怪,當我忽略WHERE子句與WHERE子句完全比較時,我怎麼能看似少數據? – Gorgsenegger 2013-03-05 11:06:58

+0

生成查詢計劃並將其編輯到您的問題中以更詳細地查看它。 – 2013-03-05 11:12:16

+0

由於WTS互聯網限制,我無法上傳計劃截圖,因此我將在今晚更新問題。 – Gorgsenegger 2013-03-05 12:21:44

相關問題