代码之家  ›  专栏  ›  技术社区  ›  Storm

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

  •  1
  • Storm  · 技术社区  · 15 年前

    当运行这样的查询而不在任何表中插入时,我得到了这个结果。在SSMS 2008中。

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

    为什么会这样?

    4 回复  |  直到 11 年前
        1
  •  4
  •   joshcomley    15 年前

    首先,您可能需要“<>”而不是“!=“在SQL Server中。

    编辑:

    spec of ISNUMERIC 你可以看到它在寻找任何能达到BIGINT的东西。

    BIGINT的最大值为9223372036854775807,长度为19个字符。因此,如果您的属性值长度大于19个字符,它将被截断,以测试它是否是SQL Server中可用的有效数字。

        2
  •  0
  •   Bravax    15 年前

    返回的所有字段的长度是否可能大于8000个字符?

    我想那可能会导致那个错误。

        3
  •  0
  •   Justin Samuel    14 年前

    主要原因是必须在存储过程中获取临时表(或相同的表),临时表的数据类型和实际表的数据类型的大小必须不匹配。

        4
  •  0
  •   Pierre    10 年前

    ISNUMERIC的字符限制为308个整数字符,在某些情况下为309个字符,如果是这样,它将返回true,在一定数量的字符之后,它将给出上述错误。

    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