2010-01-29 1 views
0

У меня есть длинная хранимая процедура, которая строит строку запроса. Он отлично работает, пока я не добавить в описание поля А «LIKE» (текст), который имеет подстановочные знаки в нем, смотрите ниже:SQL Server 2005 Проблема с хранимой процедурой contatenating string с подстановочным знаком

IF @AdDescription IS NOT NULL 
    IF @AdSection IS NOT NULL 
     BEGIN 
      SET @SQL = @SQL + @Wand + 'na.Section = '' + @AdDescription + ''' 
      SET @Wand = ' AND ' 
     END 
    ELSE 
     BEGIN 
      SET @SQL = @SQL + @Wand + '(na.AdDesc LIKE ''' + @AdDescription + '%'')' 
      SET @Wand = ' AND ' 
     END 

Я пробовал несколько вариантов, но как только @AdDescription не имеет ничего в нем он не работает. Есть ли что-то очевидное, что мне не хватает?

+0

Не удается с какой ошибкой напечатать переменную @sql до exec и отправить ее тоже. –

+0

Не могли бы вы указать «fail»? Что происходит, и как это отличается от того, что вы ожидаете? Вы получаете сообщение об ошибке? – Guffa

+0

Как мне напечатать переменную @sql? Я вхожу в хранимую процедуру, но это не позволяет мне просматривать встроенную строку, что было бы действительно полезно. Я поставил точки останова, но он не ударил их. Я использую визуальную студию 2008 года, но у меня нет полной версии (это обсуждение, которое вы должны иметь с моим боссом), поэтому мои возможности отладки ограничены. – flavour404

ответ

2

Попробуйте использовать печать, чтобы увидеть созданный вами SQl, тогда вы, скорее всего, увидите ошибку. И старайтесь очень трудно избежать динамического sql, его трудно поддерживать, тестировать и отлаживать должным образом.

Вместо Exec СКП просто это сделать:

печати @SQL

Это распечатывает заявление SQL.

Обычно у нас есть параметр отладки в любом сохраненном proc, который использует динамический SQl abd, если он установлен в 1, он печатает SQL и если он установлен в 0 (по умолчанию), он выполняет SQL. Это облегчает просмотр того, что создается для набора значений позже, когда proc не работает на производстве, из-за какого-то неясного состояния, которое вы не рассматривали.

Вы также можете получить SQl, выполняемый профайлером, но обычно проще просто работать с одинаковыми значениями в режиме отладки.

+0

Нет другого способа, кроме динамического. Как распечатать sql? – flavour404

2

Вам не хватает апострофа в вашей первой строке «SET @SQL». Перед добавлением @AdDescription должно быть 3 апострофа. Цветовая кодировка в вашем коде выше показывает эту проблему. Знаки плюса - красный, а не черный.

-1

Редактировать Возможно, это всего лишь кавычки? Я добавил несколько пробелов, чтобы ускорить работу.

IF @AdDescription IS NOT NULL 
    IF @AdSection IS NOT NULL 
     BEGIN 
      SET @SQL = @SQL + @Wand 
       + 'na.Section = ' ''' + @AdDescription + ''' ' 
      SET @Wand = ' AND ' 
     END 
    ELSE 
     BEGIN 
      SET @SQL = @SQL + @Wand 
       + '(na.AdDesc LIKE ' ''' + @AdDescription + '%'')' 
     END 
+0

Erm, нет его нет, он используется позже для конкатенации дополнительной информации. Я понимаю, что это трудно увидеть, не видя остальной части запроса. – flavour404

+0

1. Каково значение @Wand, когда вы выполняете SET @SQL + @Wand? 2. Я просто добавил некоторые недостающие одинарные кавычки. – egrunin

+0

@Wand начинаются как WHERE, он заменяется только на AND после первого использования, довольно стандартным шаблоном для динамического sql. –

Смежные вопросы