SQL Server转换错误:转换nvarchar值时转换失败' XXX'到数据类型int

时间:2015-05-19 22:51:37

标签: sql-server sql-server-2008 tsql

在这里运行一些非常简单的SQL:

select * 
from table
where columnA <> convert(int,columnB)
  and isnumeric(columnB) = 1

每次都会出现此错误:

  

转换nvarchar值&#39; XXX&#39>时转换失败数据类型int。

5 个答案:

答案 0 :(得分:1)

如果您正在使用SQL Server 2012或更新版本,则可以使用TRY_PARSE,当解析失败时,NULL会返回SELECT TRY_PARSE('one' as int) -- NULL , TRY_PARSE('1' as int) -- 1 , TRY_PARSE('0.1' as int) -- NULL

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': '~/django/bin/django_test/storage.db' 
}
  

返回表达式的结果,转换为请求的数据类型,如果在SQL Server中转换失败,则返回null。仅使用TRY_PARSE将字符串转换为日期/时间和数字类型。

答案 1 :(得分:0)

Isnumeric有很多奇怪的行为。例如,它还会将货币符号(例如$或£),甚至连字符( - )视为数字。

我认为您最好只使用

NOT columnB like '%[^0-9]%'
来考虑数字。

检查msdn页面底部的注释isnumeric(),您可以在此处找到:https://msdn.microsoft.com/en-us/library/ms186272.aspx

答案 2 :(得分:0)

我在这里结合使用了答案和评论。我在CASE子句中使用了WHERE语句,并且还必须使用LIKE代替ISNUMERIC来说明非法字符。我还必须使用BIGINT因为一些选定的样本溢出了INT列。感谢所有人的建议!

select * from patient
where PatientExternalID <> 
    (case when mrn not like '%[^0-9]%'
          then convert(bigint, mrn) 
       else 0 
    end)

答案 3 :(得分:0)

这可能听起来很奇怪,但是当不首先进行ISNUMERIC检查时会中断。试试这个:

WITH [Table]
AS
(
    SELECT columnA,columnB
    FROM
    (
        VALUES  (1,'2'),
                (2,'XXX')
    ) A(columnA,columnB)
)

select *
from [Table]
where       ISNUMERIC(columnB) = 1          --this works
        AND columnA <> convert(int,columnB)

--where     columnA <> convert(int,columnB) --this doesn't work
--      and isnumeric(columnB) = 1

答案 4 :(得分:0)

我建议你像这样反转你的检查:

SELECT * 
FROM table
WHERE CONVERT(NVARCHAR, columnA) <> columnB