Sql-Server
將 Varchar 轉換為 Int 錯誤
我今天遇到了一個問題,雖然我能夠解決它,但我不確定是什麼導致了問題的發生。
我有一列是 Varchar(20)。它僅用於儲存年份數據(2010、2011 等)。它正在轉換為 Int 數據類型,但是當執行以下命令時,會發生錯誤程式碼。
ALTER TABLE mytable ALTER COLUMN1 int NULL
顯示的錯誤是:
Conversion failed when converting the varchar value '2010. ' to data type int.
表中有 3 行,Column1 中的值為 2010,但沒有以
'2010. '
(句點和 10 個空格)作為值的行。我跑了select len(Column1) from MyTable where Column1 like '%2010%'
我得到了長度為 4 的 2 行,長度為 5 的 1 行。將長度為 5 的行更新為 2010 作為值後,可以更改表。
我很好奇時期和空間是從哪裡來的。也很好奇 1 個字元長度的增加如何導致一個句點和 10 個空格。我在想一些類似於輸入或換行的東西,但我找不到任何數據來支持它,這只是一種預感。
您需要準確確定原始字元串中的字元。希望您在某處擁有原件的副本。我猜它實際上並不是一個句點,即使它顯示為一個。此查詢可能會有所幫助
declare @s table ( col varchar(20) not null ); insert @s(col) values ('2010'), ('2010. '); ;with Numbers as ( select top(20) rn = ROW_NUMBER() over (order by (select 1)) from sys.objects as o ) select s.col, n.rn, SUBSTRING(s.col, n.rn, 1), ASCII(SUBSTRING(s.col, n.rn, 1)), UNICODE(SUBSTRING(s.col, n.rn, 1)) from @s as s cross apply Numbers as n where n.rn < = DATALENGTH(s.col) and s.col like '%2010%' order by s.col, n.rn;
CTE 只是一個快速數字表,靜態大小為列的聲明寬度。它將在輸入數據中每個可能的字元位置返回一行。
主查詢使用 CTE 的輸出作為序號索引,一次提取一個字元。