SQL Server 2005存储过程问题将字符串与通配符连接

时间:2010-01-29 19:47:10

标签: sql sql-server-2005

我有一个冗长的存储过程来构建查询字符串。它工作正常,直到我添加一个带有通配符的'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 个答案:

答案 0 :(得分:2)

尝试使用print查看您创建的SQl,然后您可能会看到错误。并且尽量避免动态sql,很难正确维护,测试和调试。

而不是执行SQl只是让它做:

打印@SQL

这将打印SQL语句。

我们通常在使用动态SQl abd的任何存储过程上都有一个调试参数,如果它设置为1,它会输出SQL,如果设置为0(默认值),它会执行SQL。这使得在生产过程失败时更容易看到为一组值创建的内容,因为您没有考虑到一些模糊的情况。

你也可以通过运行profiler来执行SQl,但通常在调试模式下使用相同的值运行更简单。

答案 1 :(得分:2)

你在第一个“SET @SQL”行中缺少一个撇号。在添加@AdDescription之前应该有3个撇号。上面代码中的颜色编码显示了这个问题。加号是红色而不是黑色。

答案 2 :(得分:-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