我有两张桌子。
DECLARE @definitions TABLE
( fDefId varchar(8) ,
dType varchar(MAX) ,
fName varchar(MAX)
)
INSERT @definitions values('8c7eab0e','string','custpartno')
INSERT @definitions values('8c7eab02','int' ,'itemno' )
DECLARE @fields TABLE
( rowId varchar(8) ,
fkFId varchar(8) ,
adj varchar(MAX)
)
INSERT @fields values('83EDE211','8c7eab0e','89319971151801')
INSERT @fields values('83EDE211','8c7eab02','1' )
我正在尝试查找@fields
值不是 an并且表中int
相关记录的值为 的记录。@definitions
dType
'int'
当我尝试获取此结果列表(如果有)时,我尝试了以下语句:
SELECT f.rowId ,
f.fkFId ,
f.adj ,
d.fName
FROM @fields f
JOIN @definitions d ON f.fkFId = d.fDefId
AND d.dType = 'int'
WHERE ISNUMERIC( adj ) <> 1
OR CAST( adj AS INT ) <> adj
SELECT *
FROM ( SELECT f.rowId ,
f.fkFId ,
f.adj ,
d.fName
FROM @fields f
JOIN @definitions d ON f.fkFId = d.fDefId
AND d.dType='int'
) a
WHERE ISNUMERIC( adj ) <> 1
OR CAST( adj AS INT ) <> adj
并且两者都出现了这个错误:
The conversion of the varchar value '89319971151801' overflowed an int column.
但是,当我第一次将值存储在这样的表变量中时:
DECLARE @temp TABLE
( rowId varchar(8),
fDefId varchar(8),
adjusted varchar(MAX)
)
INSERT @temp
SELECT f.rowId ,
f.fkFId ,
f.adj
FROM @fields f
JOIN @definitions d ON f.fkFId = d.fDefId
AND d.dType = 'int'
SELECT * FROM @temp
WHERE ISNUMERIC( adjusted ) <> 1
OR CAST( adjusted AS INT ) <> adjusted
我得到了预期的结果(本例中没有记录)。
如果我删除该WHERE
子句,我会得到以下结果:
没有大字段的行,那么为什么添加后会导致错误WHERE
?
我也可以通过转换 asBIGINT
而不是来避免这个问题INT
,但是为什么这很重要,因为JOIN
andWHERE
子句从一开始就删除了不是 an 的值INT
?