sql-server – SQL Server:将varchar转换为INT
我不得不将varchar列UserID转换为INT.我知道,请不要问为什么这个UserID列没有被创建为INT最初的长篇故事.
所以我试过这个,但它不行.给我一个错误: select CAST(userID AS int) from audit 错误:
我从审核中选择了len(userID),它返回128个字符,不是空格. 我试图检测到ID号后面的ASCII字符,ASCII值= 0. 更新!!! 我也尝试过LTRIM,RTRIM,并用”替换char(0),但不起作用. 当我告诉固定数量的字符,如下所示,唯一的工作方式,但UserID并不总是4个字符. select CAST(LEFT(userID,4) AS int) from audit 谢谢, 解决方法您可以尝试更新表以摆脱这些字符:UPDATE dbo.[audit] SET UserID = REPLACE(UserID,CHAR(0),'') WHERE CHARINDEX(CHAR(0),UserID) > 0; 但是,然后,您还需要修复将这些坏数据放在表中的任何事情.在此期间也许尝试: SELECT CONVERT(INT,REPLACE(UserID,'')) FROM dbo.[audit]; 但这不是一个长期的解决方案.修复数据(以及数据类型).如果您无法立即修复数据类型,则可以通过添加检查约束来快速找到凶手: ALTER TABLE dbo.[audit] ADD CONSTRAINT do_not_allow_stupid_data CHECK (CHARINDEX(CHAR(0),UserID) = 0); 编辑 好的,所以这绝对是一个4位整数,后面是六个CHAR(0)的实例.而我发布的解决方法绝对适用于我: DECLARE @foo TABLE(UserID VARCHAR(32)); INSERT @foo SELECT 0x31353831000000000000; -- this succeeds: SELECT CONVERT(INT,'')) FROM @foo; -- this fails: SELECT CONVERT(INT,UserID) FROM @foo; 请确认此代码自己(好的,第一个SELECT,无论如何)适用于您.如果这样做,那么你所得到的错误是来自不同行中的一个不同的非数字字符(如果不是那么也许你有一个构建,一个特定的错误还没有被修复).要尝试缩小它,您可以从以下查询中获取随机值,然后循环遍历字符: SELECT UserID,CONVERT(VARBINARY(32),UserID) FROM dbo.[audit] WHERE UserID LIKE '%[^0-9]%'; 所以采取随机行,然后将输出粘贴到这样的查询中: DECLARE @x VARCHAR(32),@i INT; SET @x = CONVERT(VARCHAR(32),0x...); -- paste the value here SET @i = 1; WHILE @i <= LEN(@x) BEGIN PRINT RTRIM(@i) + ' = ' + RTRIM(ASCII(SUBSTRING(@x,@i,1))) SET @i = @i + 1; END 这可能需要一些尝试和错误才能遇到由于某些其他原因而不是CHAR(0)的行 – 因为您不能真正过滤掉包含CHAR(0)的行,因为它们可能包含CHAR(0)和CHAR (别的)对于我们所有人,我们知道你在表中有价值,如: SELECT '15' + CHAR(9) + '23' + CHAR(0); …也不能转换为整数,无论??您是否已经替换了CHAR(0). 我知道你不想听到,但我很高兴这对人们来说是痛苦的,因为当人们对数据类型做出非常糟糕的决定时,现在他们有更多的战争故事可以推回. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |