您可以尝试更新表格以摆脱这些字符:
UPDATE dbo.[audit]
SET UserID = REPLACE(UserID, CHAR(0), '')
WHERE CHARINDEX(CHAR(0), UserID) > 0;
但是,您还需要首先修复将这些不良数据放入表中的任何问题。同时也许尝试:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), ''))
FROM dbo.[audit];
但这不是一个长期的解决方案。修复数据(以及处理数据时的数据类型)。如果你不能立即修复数据类型,那么你可以通过添加检查约束来快速找到罪魁祸首:
ALTER TABLE dbo.[audit]
ADD CONSTRAINT do_not_allow_stupid_data
CHECK (CHARINDEX(CHAR(0), UserID) = 0);
编辑
好的,这绝对是一个 4 位整数,后跟 6 个 CHAR(0) 实例。我发布的解决方法肯定对我有用:
DECLARE @foo TABLE(UserID VARCHAR(32));
INSERT @foo SELECT 0x31353831000000000000;
-- this succeeds:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), '')) 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)
and CHAR(something else)
。据我们所知,您在表格中有如下值:
SELECT '15' + CHAR(9) + '23' + CHAR(0);
...无论您是否已替换,它也无法转换为整数CHAR(0)
。
我知道你不想听到它,但我真的很高兴这对人们来说是痛苦的,因为现在当人们对数据类型做出非常糟糕的决定时,他们有更多的战争故事要反击。