我今天遇到了一个问题,虽然我能够解决它,但我不确定是什么导致了问题的发生。
我有一列是 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%'
我得到 2 行长度为 4,1 行长度为 5。在将长度为 5 的行更新为 2010 作为值后,可以更改表。
我很好奇时期和空间是从哪里来的。也很好奇 1 个字符长度的增加如何导致一个句点和 10 个空格。我在想一些类似于回车或换行的东西,但我找不到任何数据来支持它,这只是一种预感。
大多数 SQL 发行版中的 LEN() 不包含空格。你会想要使用类似 DATALENGTH() 的东西。 https://stackoverflow.com/questions/1151693/len-vs-datalength-in-sql-server-2005 至于“。”在哪里 并且空间来自,我们需要更多信息,例如该字段是如何填充的?什么应用程序,直接通过 SQL 等。
此外,了解您正在使用的发行版会很有帮助。我假设 SQL Server。
您需要准确确定原始字符串中的字符。希望您在某处拥有原件的副本。我猜它实际上并不是一个句号,即使它显示为一个。此查询可能会有所帮助
CTE 只是一个快速数字表,静态大小为列的声明宽度。它将在输入数据中每个可能的字符位置返回一行。
主查询使用 CTE 的输出作为序号索引,一次提取一个字符。