当我在SSMS中执行此查询时
SELECT SUBSTRING(NAME, 1, LEN(NAME) - 4)
FROM sys.tables
我收到错误:
传递给LEFT或SUBSTRING函数的长度参数无效。
但是当我在这里执行此查询时:
SELECT SUBSTRING(NAME, 1, LEN(NAME) - 4)
FROM sys.tables
WHERE NAME LIKE '%_OLD'
我得到了输出。第一次查询失败的原因是什么?
答案 0 :(得分:1)
原因是您的脚本失败的原因是某些表的长度少于4个字符。 SUBSTRING的第三个参数不能为负。
这是一种解决方法:
SELECT
REVERSE(STUFF(REVERSE(NAME), 1,4,''))
FROM
Sys.tables
脚本反转文本,删除前4个字符并再次反转其余字符。
答案 1 :(得分:0)
请注意,SUBSTRING
函数的最后一个参数必须是正值。
您可能有一些名称短于5个字符的表。
尝试执行此操作以查看表格中的最小名称长度:
SELECT MIN(LEN(Name)) AS MinLength
FROM Sys.tables
答案 2 :(得分:0)
如果length
参数不是有效长度,即negative
。你得到这个错误。
长度: 是一个正整数或bigint表达式,指定方式 将返回表达式的许多字符。如果长度是 否定,生成错误并终止语句。如果 start和length的总和大于字符数 在表达式中,从start开始的整个值表达式是 返回
E.g:
SELECT SUBSTRING('any string',1, -1)
它给出错误:
传递给子字符串函数的长度参数无效。
LIKE '%_OLD'
不会给出错误,因为它Min length
为4
,因此Min
LEN(NAME)-4
的值为0 or positive.