所以我试过这个,但它不行.给我一个错误:
select CAST(userID AS int) from audit
错误:
Conversion Failed when converting the varchar value
‘1581…………………………………………………………………………………………………………….’ to data type int.
我从审核中选择了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).
我知道你不想听到,但我很高兴这对人们来说是痛苦的,因为当人们对数据类型做出非常糟糕的决定时,现在他们有更多的战争故事可以推回.