2010-01-29 49 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的非常標準模式。 –