在这里运行一些非常简单的SQL:
select *
from table
where columnA <> convert(int,columnB)
and isnumeric(columnB) = 1
每次都会出现此错误:
转换nvarchar值&#39; XXX&#39>时转换失败数据类型int。
答案 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