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

У меня есть 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 с комментариями работает нормально. Может ли кто-нибудь помочь мне заставить работать строку без комментариев?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
59
0
227 595
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Джоэл, это что @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).

На мой взгляд, это должен быть принятый ответ. установка "%" в значение переменной работает и делает результат таким же простым, как "WHERE ... like @variable"

Kirby L. Wallace 28.08.2020 04:12

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

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)

Другие вопросы по теме