Подтвердить что ты не робот

Использование переменной в SQL LIKE-заявлении

У меня есть 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]

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + @PartialName + '%'

Ответ 3

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

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

SELECT Name 
    FROM <table>
    WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'

Ответ 4

DECLARE @SearchLetter2 char (1)

Установите для этого более длинный char.

Ответ 5

Это работает для меня в DB образца 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'

Ответ 6

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

"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..." ).

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

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

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

Ответ 7

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

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' 

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

Ответ 8

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

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

Ответ 9

У меня также была проблема с использованием локальных переменных в LIKE.
Важно знать: как долго переменная.
Ниже ORDER_NO имеет длину 50 символов, поэтому вы не можете использовать: LIKE @ORDER_NO, потому что в конце будут пробелы.
Сначала нужно обрезать правую часть переменной.
Как это:

DECLARE @ORDER_NO char(50)
SELECT @ORDER_NO = 'OR/201910/0012%'

SELECT * FROM orders WHERE ord_no LIKE RTRIM(@ORDER_NO)