【问题标题】:Invalid length parameter passed to the SUBSTRING function error传递给 SUBSTRING 函数错误的长度参数无效
【发布时间】:2016-06-09 01:22:54
【问题描述】:

我有以下工作正常的 T-SQL 查询:

declare @myString varchar(max) = 'Import Development \ local \ Jan
2016 \ Jenny Asti \ reimbur.docx'  

select substring((@myString), 1, len(@myString) - charindex('\', reverse (@myString)))

我希望在最后一个反斜杠之前返回字符串,并且我正确地得到了这个:

Testing Development \ local \ Jan 2016 \ Jenny Asti

但是,我需要为表运行此命令,而不是使用变量。所以,我改成了如下:

select substring([path], 1, len(path)- charindex('\',reverse(path))) from test

但我得到一个错误:Invalid length parameter passed to the SUBSTRING function.

我可以确认\ 确实存在于表中。此外,如果我查看结果窗口,查询能够列出以下内容:

导入开发\本地\Jan 2016 \Jenny

我认为解析字符串的最后一部分有问题 Asti \ reimbur.docx.

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012 substring


    【解决方案1】:

    如果源值有尾随空格,您使用的公式将返回不正确的结果。

    例如:

    declare @myString varchar(max) = 'Jan 2016 \ Jenny Asti \ reimbur.docx';
    select substring((@myString), 1, len(@myString) - charindex('\', reverse (@myString)))
    

    返回:

    Jan 2016 \ Jenny Asti 
    

    但是,

    declare @myString varchar(max) = 'Jan 2016 \ Jenny Asti \ reimbur.docx    ';
    select substring((@myString), 1, len(@myString) - charindex('\', reverse (@myString)))
    

    返回:

    Jan 2016 \ Jenny A
    

    我在第二个例子中添加了四个空格。

    这种行为的原因是LEN 函数返回忽略尾随空格的字符串长度,但REVERSE 不会忽略它们。

    修正公式的一种方法是修剪尾随空格:

    declare @myString varchar(max) = 'Jan 2016 \ Jenny Asti \ reimbur.docx    ';
    select substring((@myString), 1, len(@myString) - charindex('\', reverse(RTRIM(@myString))))
    

    这将返回正确的结果:

    Jan 2016 \ Jenny Asti 
    

    您会收到该错误消息

    传递给 SUBSTRING 函数的长度参数无效。

    因为原始字符串的LEN 和反向字符串的LEN 由于数据中的尾随空格而不同。

    例如(注意,字符串中有两个尾随空格):

    declare @myString varchar(max) = 'a\b  ';
    select substring((@myString), 1, len(@myString) - charindex('\', reverse (@myString)))
    

    将返回:

    Invalid length parameter passed to the LEFT or SUBSTRING function.
    

    【讨论】:

    • 弗拉基米尔,你摇滚!!!这解决了我的问题,非常感谢,我非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2013-01-11
    • 2023-03-14
    • 2014-03-01
    相关资源
    最近更新 更多