2010-01-29 48 views
0

我有一个冗长的存储过程来构建查询字符串。它正常工作,直到我在“喜欢”说明字段中添加(文本),其中有一个通配符,见下图:SQL Server 2005使用通配符连接字符串的存储过程问题

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变量并发布该错误。 –

+0

你能指定“失败”吗?会发生什么,以及这与预期的有何不同?你有任何错误信息? – Guffa

+0

如何“打印”@sql变量?我正在进入存储过程,但它不允许我查看构建的字符串,这非常有用。我已经提出了突破点,但没有打到他们。 我正在使用visual studio 2008,但我没有完整版本(这是您应该与我的老板讨论过),所以我的调试功能有限。 – flavour404

回答

2

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

代替EXEC版的sql只是在用它做:

打印@SQL

这将打印的SQL语句。

对于任何使用动态SQl abd的存储过程,如果它设置为1,它将打印SQL,如果它设置为0(默认值),它将执行SQL,通常有一个调试参数。这样可以更容易地看到当proc在生产中出现故障时由于某些你不认为的模糊情况而在一组值中创建了什么。

YOu也可以通过运行profiler来获取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

呃,没有它,它稍后用来连接更多的信息。我意识到很难在没有看到其他查询的情况下看到这一点。 – flavour404

+0

1.当您执行SET @ SQL + @Wand时,@Wand的价值是多少? 2.我也添加了一些缺失的单引号。 – egrunin

+0

@Wand作为开始,因为它只是在第一次使用后才变为AND,这是动态sql的非常标准模式。 –