错误:字符串或二进制数据将被截断

时间:2009-08-14 08:41:42

标签: sql-server sql-server-2008

我在运行这样的查询时得到这个但没有插入任何表格。在SSMS 2008中。

select iav.*
from ITEM_ATTRIBUTE_VALUE iav
where iav.attribute_value != ''
    and ISNUMERIC(iav.attribute_value) = 0

为什么会这样做?

4 个答案:

答案 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