Использование переменной в выражении SQL LIKE - PullRequest
36 голосов
/ 24 декабря 2008

У меня есть sproc (MSSQL 2k5), который будет принимать переменную для условия LIKE следующим образом:

DECLARE @SearchLetter2 char(1)
SET @SearchLetter = 't'
SET @SearchLetter2 = @SearchLetter + '%'
SELECT *
    FROM BrandNames 
    WHERE [Name] LIKE @SearchLetter2 and IsVisible = 1 
    --WHERE [Name] LIKE 't%' and IsVisible = 1 
    ORDER BY [Name]

К сожалению, текущая строка генерирует синтаксическую ошибку, в то время как прокомментированное предложение where работает нормально. Может ли кто-нибудь помочь мне заставить работать строку без комментариев?

Ответы [ 8 ]

67 голосов
/ 01 октября 2012

Если вы используете хранимую процедуру:

ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + @PartialName + '%'
18 голосов
/ 24 декабря 2008

Джоэл, @SearchLetter еще не объявлен? Также длина @ SearchLetter2 недостаточно велика для 't%'. Попробуйте varchar большей длины.

10 голосов
/ 19 мая 2013

Как говорит Эндрю Брауэр, но добавляя обрезку

ALTER PROCEDURE <Name>
(
    @PartialName VARCHAR(50) = NULL
)

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'
4 голосов
/ 07 мая 2013

Но, на мой взгляд, одна важная вещь.

"char (число)" это длина переменной.

Если у нас есть таблица с «Именами», например, [Test1..Test200], и мы объявляем char (5) в SELECT, например:

DECLARE @variable char(5)
SET @variable = 'Test1%'
SELECT * FROM table WHERE Name like @variable

результат будет только - "Test1"! (char (5) - 5 символов в длине; Test11 равен 6)

Остальные потенциальные данные, такие как [Test11..Test200], не будут возвращены в результате.

Это нормально, если мы хотим ограничить SELECT таким способом. Но если это не преднамеренный способ, он может вернуть неверные результаты из запланированных (Например, «все имена начинаются с Test1 ...»).

По моему мнению, если мы не знаем точную длину выбранного значения, лучшим решением может быть что-то вроде этого:

DECLARE @variable varchar(max)
SET @variable = 'Test1%'
SELECT * FROM <table> WHERE variable1 like @variable

Возвращает (Test1, но также Test11..Test19 и Test100..Test199).

4 голосов
/ 24 декабря 2008

Это работает для меня в примере базы данных Northwind, обратите внимание, что SearchLetter имеет 2 символа, и SearchLetter также должен быть объявлен для запуска:

declare @SearchLetter2 char(2)
declare @SearchLetter char(1)
Set @SearchLetter = 'A'
Set @SearchLetter2 = @SearchLetter+'%'
select * from Customers where ContactName like @SearchLetter2 and Region='WY'
4 голосов
/ 24 декабря 2008

DECLARE @ SearchLetter2 char (1)

Установите более длинный символ.

3 голосов
/ 26 июня 2012

Мы тоже можем написать напрямую ...

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' 

SELECT * 
FROM   CUSTOMERS 
WHERE  CONTACTNAME LIKE @SearchLetter + '%' 
       AND REGION = 'WY' 

или следующим образом, если нам нужно добавить все символы поиска,

DECLARE @SearchLetter CHAR(1) 

SET @SearchLetter = 'A' + '%' 

SELECT * 
FROM   CUSTOMERS 
WHERE  CONTACTNAME LIKE @SearchLetter 
       AND REGION = 'WY' 

Оба они будут работать

1 голос
/ 27 сентября 2018

Это может быть просто LIKE '%%[%3]%%', являющаяся [%3] входной переменной.

Это работает для меня с SAP B1 9.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...