SQL Server, ПОДОБНЫЙ с квадратными скобками, работает напрямую, но не использует переменную

#sql #sql-server #sql-like

#sql #sql-server #sql-подобный

Вопрос:

Я использую квадратные скобки в подобном, чтобы указать диапазон подстановочных знаков. Странно то, что использование выражения непосредственно в инструкции работает правильно, извлекая ожидаемые строки. Но использование того же выражения из переменной не дает никаких результатов. Почему он не работает из переменной?

Работает:

 SELECT * FROM dbo.Table WHERE Column LIKE '%B[A-Z][A-Z]%';
Results: BAA, BAB, BAC, ... until BZZ
 

Не работает:

 DECLARE @var VARCHAR(10)
SET @var = N'B[A-Z][A-Z]'
SELECT * FROM dbo.Table WHERE Column LIKE CONCAT('%', @var, '%');
 

Я также пытался объединить с , но все равно получал нулевые результаты (НАПРИМЕР, ‘%’ @var ‘%’)

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

 SET @var = N'B[A-Z]'
SELECT * FROM dbo.Table WHERE Column LIKE '%'   @var   '%';
Results: BA, BB, BC, BD, ....
 

Комментарии:

1. Ваш код работает нормально: dbfiddle.uk /.

2. Ваша переменная недостаточно длинная для шаблона, поэтому она усекается

3. Thansk @cf_en. В этом и была проблема! Я не понимаю, почему Management Studio не уведомила об усечении

4. Поскольку документально подтверждено, что он усекает значение @2k.silvio . Из преобразования символьных данных : «Когда символьные выражения преобразуются в символьный тип данных другого размера, значения, которые слишком длинны для нового типа данных, усекаются». Вы преобразуете a varchar(11) в a varchar(10) , и, следовательно, значение усекается.

Ответ №1:

Сделайте вашу переменную длиннее, чтобы она могла хранить весь шаблон. Вы можете увидеть, какое значение на самом деле имеет переменная PRINT @var , которая покажет вам, что закрывающая квадратная скобка была удалена.

 declare @var varchar(10) = 'B[A-Z][A-Z]'
print @var