#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)
в avarchar(10)
, и, следовательно, значение усекается.
Ответ №1:
Сделайте вашу переменную длиннее, чтобы она могла хранить весь шаблон. Вы можете увидеть, какое значение на самом деле имеет переменная PRINT @var
, которая покажет вам, что закрывающая квадратная скобка была удалена.
declare @var varchar(10) = 'B[A-Z][A-Z]'
print @var