У меня есть sproc (MSSQL 2k5), который будет принимать переменную для LIKE claus следующим образом:
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 с комментариями работает нормально. Может ли кто-нибудь помочь мне заставить работать строку без комментариев?





Джоэл, это что @SearchLetter еще не объявлен? Также длина @ SearchLetter2 недостаточна для "t%". Попробуйте использовать varchar большей длины.
DECLARE @ SearchLetter - 2 символа (1)
Установите это на более длинный символ.
Это работает для меня в образце БД 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'
Мы тоже можем писать напрямую ...
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'
Оба они будут работать
Если вы используете хранимую процедуру:
ALTER PROCEDURE <Name>
(
@PartialName VARCHAR(50) = NULL
)
SELECT Name
FROM <table>
WHERE Name LIKE '%' + @PartialName + '%'
Но на мой взгляд важный момент.
«Char (число)» - это длина переменной.
Если у нас есть таблица с «Именами», например [Test1..Test200], и мы объявляем char (5) в SELECT, например:
DECLARE @variable char(5)
SET @variable = 'Test1%'
SELECT * FROM table WHERE Name like @variable
результат будет только - «Тест1»! (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).
Как говорит Эндрю Брауэр, но добавив обрезки
ALTER PROCEDURE <Name>
(
@PartialName VARCHAR(50) = NULL
)
SELECT Name
FROM <table>
WHERE Name LIKE '%' + LTRIM(RTRIM(@PartialName)) + '%'
Это может быть так просто, как LIKE '%%[%3]%%' как входная переменная [%3].
Это работает для меня с SAP B1 9.1
У меня также была проблема с использованием локальных переменных в LIKE.
Важно знать: как долго переменный.
Ниже № ЗАКАЗА имеет длину 50 символов, поэтому вы не можете использовать: НРАВИТСЯ @ORDER_NO, потому что в конце будут пробелы.
Сначала вам нужно обрезать правую часть переменной.
Как это:
DECLARE @ORDER_NO char(50)
SELECT @ORDER_NO = 'OR/201910/0012%'
SELECT * FROM orders WHERE ord_no LIKE RTRIM(@ORDER_NO)
На мой взгляд, это должен быть принятый ответ. установка "%" в значение переменной работает и делает результат таким же простым, как "WHERE ... like @variable"