sql-server – SQL Server:将varchar转换为INT

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server:将varchar转换为INT前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不得不将varchar列UserID转换为INT.我知道,请不要问为什么这个UserID列没有被创建为INT最初的长篇故事.

所以我试过这个,但它不行.给我一个错误

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).

我知道你不想听到,但我很高兴这对人们来说是痛苦的,因为当人们对数据类型做出非常糟糕的决定时,现在他们有更多的战争故事可以推回.

原文链接:https://www.f2er.com/mssql/82857.html

猜你在找的MsSQL相关文章