Наступил на днях на SQL-грабли, связанные с оператором LIKE и шаблонами подстановки
Допустим есть табличка с назначениями платежа
DECLARE @t TABLE (id INT, goal VARCHAR(255))
INSERT INTO @t (id, goal) VALUES (1, 'Оплата за товар на общую сумму [сумма]')
INSERT INTO @t (id, goal) VALUES (2, 'Оплата по договору [договор]')
значение в квадратных скобках должно работать как шаблон и вычисляться по определенному алгоритму
Все началось с того, что по определенному условию перестал подставляться шаблон, при этом назначение платежа обнулялось
DECLARE @Goal VARCHAR(255)
SELECT @Goal=goal FROM @t WHERE id = 1
IF @Goal LIKE '%[сумма]%'
SELECT @Goal=REPLACE(@Goal, '[Сумма]', '120.00')
IF @Goal LIKE '%[аммус]%'
SELECT @Goal=NULL
SELECT @Goal
Ответ, как ни странно с первого взгляда - NULL
Оказалось все дело в макроподстановках оператора LIKE
Чтобы запросы верно отработали достаточно было прописать ESCAPE символы
IF @Goal LIKE '%&[сумма&]%' ESCAPE '&'
SELECT @Goal=REPLACE(@Goal, '[Сумма]', '120.00')
IF @Goal LIKE '%&[аммус&]%' ESCAPE '&'
SELECT @Goal=NULL
SELECT @Goal
Аналогичным образом выбираются все строки из таблицы, в которых есть подстановка
Неправильно
SELECT * FROM @t WHERE goal LIKE '%[%'
Правильно
SELECT * FROM @t WHERE goal LIKE '%&[%' ESCAPE '&'
Вывод, надо быть внимательнее с выбором разделителя для собственной макроподстановки