私は2つのテーブルを持っています。
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
値が ではなく、テーブル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
ですか?
BIGINT
の代わりにas をキャストすることで問題を回避することもできますが、 and句が最初からではない値を削除するINT
ので、なぜそれが問題になるのでしょうか?JOIN
WHERE
INT