在SQL Server中执行子串函数时出错

时间:2015-08-17 08:32:34

标签: sql sql-server

当我在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'

我得到了输出。第一次查询失败的原因是什么?

3 个答案:

答案 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 length4,因此Min LEN(NAME)-4的值为0 or positive.