我在运行这样的查询时得到这个但没有插入任何表格。在SSMS 2008中。
select iav.*
from ITEM_ATTRIBUTE_VALUE iav
where iav.attribute_value != ''
and ISNUMERIC(iav.attribute_value) = 0
为什么会这样做?
答案 0 :(得分:3)
首先,您可能需要“<>”而不是SQL Server中的“!=”。
此外,ISNUMERIC可能必须截断iav.attribute_value以尝试测试它是否为数字,可能是最大int的长度2147483647(已签名) - 所以长度为10个字符 - 因此警告。
修改
如果查看spec of ISNUMERIC,您可以看到它查找BIGINT以外的任何内容。
BIGINT的最大值为9223372036854775807,长度为19个字符。因此,如果您的attribute_value大于19个字符,则会在尝试测试时将其截断,这是一个在SQL Server中可用的有效数字。
答案 1 :(得分:0)
返回的所有字段的长度是否可能超过8000个字符?
我认为这可能会导致错误 如果它的长度大于8000个字符,请尝试仅返回所需的列,或仅返回列的一部分。
答案 2 :(得分:0)
主要原因是必须在存储过程和临时表的数据类型中使用临时表(或相同的内容),并且实际表的数据类型必须与大小不匹配。
答案 3 :(得分:0)
ISNUMERIC的字符数限制为308个整数字符,在某些情况下为309个字符,如果是这种情况,它将返回true,在一定数量的字符后,它将产生上述错误。
执行ISNUMERIC Check的最佳方法是将字符串拆分为300个char部分,验证每个部分并返回答案。这可以通过函数或直接代码实现
DECLARE @incomingString VARCHAR(MAX) = '133450276206256972456897349683... Until 999999'
DECLARE @parts INT = 1
DECLARE @Count INT = 0
DECLARE @ISNUMERIC BIT = 1
WHILE(@parts * 300 < LEN(@incomingString))
SET @parts = @parts + 1
WHILE(@Count < @parts)
BEGIN
SET @Count = @Count + 1
IF(ISNUMERIC(SUBSTRING(@incomingString, (@Count * 300) - 299, 300)) = 0)
SET @ISNUMERIC = 0
END
SELECT CASE WHEN @ISNUMERIC = 0 THEN 'FAIL' ELSE 'SUCCESS' END