SQL 自動轉型問題
今天系統突然跳出這個訊息,就檢查了SQL,在SELECT 的地方完全沒有轉型的語法,整個卡了兩小時。 最後才發現完全跟SELECT沒關係,而是掛在WHERE的查詢條件。
舉個例子,有一個Order的table,跟型別為nvarchar(3)的Year欄位,而我要搜尋106年以後的訂單,我可以有這兩種條件下法
SELECT * FROM [Order] WHERE [Year] > 106
SELECT * FROM [Order] WHERE [Year] > '106'
以前沒什麼在意這兩種寫法的差別,今天踩到,才知道這個雷有夠大。
SQL Server 在比對兩種不同型別的時候會做Implicit Conversions,代表當我執行第一種查詢條件的時候,SQL Server 會先將Year轉型成int再來比對。所以當Year欄位只要有一筆詭異的資料
如:
使用第一種查詢寫法就...Boom。
所以在有歷史共業的資料庫,要注意特別SQL的下法阿。
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。