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

时间:2016-02-26 00:52:18

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

我有以下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.

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

  

导入开发\ local \ 2016年1月\ Jenny

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

1 个答案:

答案 0 :(得分: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.