我有一个冗长的存储过程来构建查询字符串。它工作正常,直到我添加一个带有通配符的'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中有任何内容,就会失败。有什么明显的东西我不见了吗?
答案 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