Sql-Server

將 Varchar 轉換為 Int 錯誤

  • April 21, 2020

我今天遇到了一個問題,雖然我能夠解決它,但我不確定是什麼導致了問題的發生。

我有一列是 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 的輸出作為序號索引,一次提取一個字元。

引用自:https://dba.stackexchange.com/questions/226837