[MSSQL]Conversion failed when converting the varchar value '1.6' to data type int.

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的下法阿。

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。