Sql server SQL Server:将varchar转换为INT

Sql server SQL Server:将varchar转换为INT,sql-server,Sql Server,我无法将varchar列UserID转换为INT。我知道,请不要问为什么这个UserID列最初没有创建为INT,说来话长 所以我试过了,但没用。给我一个错误: select CAST(userID AS int) from audit 错误: 转换varchar值时转换失败 “1581”改为数据类型int 我确实从audit中选择了len(userID),它返回128个字符,这些字符不是空格 我尝试检测ID号和ASCII值=0之后的ASCII字符 我还尝试了LTRIM,RTRIM,并将char

我无法将
varchar
UserID
转换为
INT
。我知道,请不要问为什么这个
UserID
列最初没有创建为INT,说来话长

所以我试过了,但没用。给我一个错误:

select CAST(userID AS int) from audit
错误:

转换varchar值时转换失败 “1581”改为数据类型int

我确实从audit中选择了len(userID),它返回128个字符,这些字符不是空格

我尝试检测ID号和ASCII值=0之后的ASCII字符

我还尝试了
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 UserID, CONVERT(VARBINARY(32), UserID)
  FROM dbo.[audit]
  WHERE UserID LIKE '%[^0-9]%';
但是,您还需要首先修复将这些坏数据放入表中的问题。与此同时,不妨尝试:

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;
请确认此代码本身(不管怎样,第一个
选择
)适用于您。如果是这样,那么您得到的错误来自不同行中的不同非数字字符(如果不是这样,那么您可能有一个尚未修复特定错误的构建)。要尝试缩小范围,可以从以下查询中获取随机值,然后循环遍历字符:

UPDATE dbo.[audit]
  SET UserID = REPLACE(UserID, CHAR(0), '')
  WHERE CHARINDEX(CHAR(0), UserID) > 0;
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)


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

我会尝试减少数字,看看你得到了什么:

select len(rtrim(ltrim(userid))) from audit
如果返回正确的值,则只需执行以下操作:

select convert(int, rtrim(ltrim(userid))) from audit
如果返回的值不正确,则我将执行替换以删除空白:

 select convert(int, replace(userid, char(0), '')) from audit

这个问题有91000个视图,所以可能很多人都在寻找一个更通用的解决方案,标题是“将varchar转换为INT时出错”

如果您在SQL Server 2012+上,处理此无效数据的一种方法是使用
TRY\u CAST

SELECT TRY_CAST (userID AS INT)
FROM   audit 
在以前的版本中,您可以使用

SELECT CASE
         WHEN ISNUMERIC(RTRIM(userID) + '.0e0') = 1
              AND LEN(userID) <= 11
           THEN CAST(userID AS INT)
       END
FROM   audit 

尝试替换空字符通常会有问题,除非使用二进制排序规则。

这更适合搜索结果的人,而不是原始的Poster。这对我有用

declare @value varchar(max) = 'sad';
select sum(cast(iif(isnumeric(@value) = 1, @value, 0) as bigint));

returns 0

declare @value varchar(max) = '3';
select sum(cast(iif(isnumeric(@value) = 1, @value, 0) as bigint));

returns 3

我就是这样解决我的问题的:

首先,我确保需要转换为整数的列不包含任何空格:

update data set col1 = TRIM(col1)
我还检查了该列是否只包含数字。
您可以通过以下方式进行检查:

select * from data where col1 like '%[^0-9]%' order by col1
如果存在任何非数值,则可以将其保存到另一个表中,并将其从正在处理的表中删除

select * into nonnumeric_data from data where col1 like '%[^0-9]%'
delete from data where col1 like '%[^0-9]%'
我的数据存在上述问题。所以在修复它们之后,我创建了一个bigint变量,并将varchar列的值设置为我创建的整数列

alter table data add int_col1 bigint
update data set int_col1 = CAST(col1 AS VARCHAR)

这对我很有用,希望您也能发现它的用处。

在表UserID列中,只有整数值或任何Varchar值。。例如:像这样的122或像这样的122Adf…?UserID列只有整数值。谢谢我尝试了从dbo.[audit];“选择CONVERT(INT,REPLACE(UserID,CHAR(0),”),但它不起作用。我也试过LTRIM和RTRIM,但都不起作用。。。谢谢你help@Milacay那么,您确定
CHAR(0)
是列中唯一的无效值吗?请确定失败的单行,然后告诉我们的输出,例如:
SELECT CONVERT(VARBINARY(32),UserID)FROM dbo。[audit]where LEFT(UserID,4)=“1581”我使用“varbinary(32)…”运行了您的查询,结果是:0x31353831000000000000。顺便说一句,这个varchar字段(userID)已从Varbinary(128)转换为varchar(128),现在我想将其转换为INT,以便与不同表上的userID联接。。。非常感谢你,亚伦。从@foo;”中选择CONVERT(INT,REPLACE(UserID,CHAR(0),“”))可以工作。很抱歉给你带来了困惑。为什么一开始就要转换成varbinary呢?还要注意,从varbinary到varchar的转换可能会产生不同的结果。尝试
选择CONVERT(VARCHAR(128),CONVERT(VARBINARY(128),'foo')),CONVERT(VARCHAR(128),CONVERT(VARBINARY(128),'foo'),1),LEN(CONVERT(VARCHAR(128),CONVERT(VARBINARY(128),'foo')),LEN(CONVERT(VARCHAR(128),CONVERT(VARBINARY(128),'foo'),1))我尝试了所有的LTRIM、RTRIM,并将字符(0)替换为“”,但都不起作用。奇怪的谢谢。请您解释一下为什么添加.0e0会使其成为数字?@Tigran它不会使其成为数字。附加此项有助于验证已为数字的字符串是否为整数。例如,
123
将在写入
123.0e0
时通过,但
123.45
将失败,因为
123.45.0e0
无效。