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