【问题标题】:Nonsense Error in SQL Server Management StudioSQL Server Management Studio 中的无意义错误
【发布时间】:2009-08-11 15:19:56
【问题描述】:

我有这个查询会产生以下错误:

SELECT * FROM Quota
WHERE LEFT(QtLabel, LEN(QtLabel)-2) IN (
'1032',
'3300',
'9682'
)

消息 536,第 16 级,状态 5,第 1 行 传递给 SUBSTRING 函数的长度参数无效。

我做错了吗?当我使用 LEN() 函数时,它往往会出现。可能是数据类型问题?

【问题讨论】:

    标签: sql-server ssms


    【解决方案1】:

    LEN(QtLabel)

    【讨论】:

    • 我的测试代码显示它就是这样。 声明@quota 表(qtlabel varchar(10));插入@quota values('1'); SELECT * FROM @Quota WHERE LEFT(QtLabel, LEN(QtLabel)-2) IN ('1032','3300','9682')
    • 啊,当然。我已经习惯了过滤掉一些记录,但这次我忘记了。傻我。
    【解决方案2】:

    您确定每个 QtLabel 字段的长度超过 2 个字符吗?

    【讨论】:

      【解决方案3】:

      LEFT 可能在内部使用 SUBSTRING。如果 QtLabel 的长度

      【讨论】:

        【解决方案4】:

        这是因为某些 QtLabel 值不包含 > 2 个字符,因此您最终尝试使用负值作为要限制的数字来执行 LEFT()。

        在您的场景中,您假设所有 QtLabel 值都是 6 个字符,所以您应该这样做:

        SELECT * FROM Quota
        WHERE LEN(QtLabel) = 6
        AND LEFT(QtLabel, LEN(QtLabel)-2) IN (
        '1032',
        '3300',
        '9682'
        )
        

        【讨论】:

          【解决方案5】:
          SELECT LEFT('MyText', -2)
          

          会抛出同样的错误

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多