2015-08-17 3 views
1

Когда я выполнить этот запрос в SSMSОшибка при выполнении подстроку функции в SQL Server

SELECT SUBSTRING(NAME, 1, LEN(NAME) - 4) 
FROM sys.tables 

Я получаю сообщение об ошибке:

Invalid length parameter passed to the LEFT or SUBSTRING function.

Но когда я выполнить этот запрос здесь:

SELECT SUBSTRING(NAME, 1, LEN(NAME) - 4) 
FROM sys.tables 
WHERE NAME LIKE '%_OLD' 

Я получаю вывод. В чем причина отказа первого запроса?

ответ

1

Причина в том, что сбой вашего скрипта состоит в том, что некоторые из таблиц имеют длину менее 4 символов. Третий параметр SUBSTRING не может быть отрицательным.

Вот обходной путь:

SELECT 
    REVERSE(STUFF(REVERSE(NAME), 1,4,'')) 
FROM 
    Sys.tables 

Скрипт обратный текст, удаляет первые 4 символа и снова реверс остальное.

+0

спасибо. это работает –

0

Обратите внимание, что последний параметр функции SUBSTRING должен быть положительным значением.

Возможно, у вас есть несколько таблиц с именами короче 5 символов.

Попробуйте выполнить это, чтобы увидеть минимальную длину имен в таблице:

SELECT MIN(LEN(Name)) AS MinLength 
FROM Sys.tables 
0

Если length параметр не является действительной длиной т.е. negative один. вы получите эту ошибку.

length: Is a positive integer or bigint expression that specifies how many characters of the expression will be returned. If length is negative, an error is generated and the statement is terminated. If the sum of start and length is greater than the number of characters in expression, the whole value expression beginning at start is returned

Например:

SELECT SUBSTRING('any string',1, -1) 

Это дает ошибку:

Invalid length parameter passed to the substring function.

LIKE '%_OLD' обыкновение давать ошибку как Min length этого будет 4, так Min значение LEN(NAME)-4 будет 0 or positive.

Смежные вопросы