SQL Server 2005 Проблема хранимой процедуры, связывающая строку с подстановочным знаком - PullRequest
0 голосов
/ 29 января 2010

У меня есть длинная хранимая процедура, которая создает строку запроса. Он работает нормально, пока я не добавлю поле описания «LIKE» (текст), в котором есть подстановочный знак, см. Ниже:

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 есть что-то, оно перестает работать. Есть ли что-то очевидное, чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 29 января 2010

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

2 голосов
/ 29 января 2010

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

Вместо того, чтобы exec SQl просто сделать это:

Печать @ SQL

Это напечатает инструкцию SQL.

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

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

0 голосов
/ 29 января 2010

Редактировать Может, это просто цитаты? Я добавил несколько пробелов, чтобы убежать было понятнее.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...