SQL-грабли. Оператор LIKE

1. ноября 2011 17:38 by Admin in MSSQL  //  Tags: , , ,   //   Комментарии (0)

Наступил на днях на 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 '&'

 

Вывод, надо быть внимательнее с выбором разделителя для собственной макроподстановки

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading

Свежачок

Календарь

<<  Февраль 2012  >>
повтсрчепясуво
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar