簡體   English   中英

參數化動態sql不返回任何結果

[英]Parameterized dynamic sql returns no results

在C#應用程序中,我創建了SQL profiler捕獲的以下參數化動態sql語句:

執行此語句不會返回任何結果:

exec sp_executesql N'SELECT IDWebFormAnswer FROM WebFormAnswers WHERE IDWebform = 55 AND IDWebFormQuestion = 478 AND (ANSWER = ''@answer0'')', N'@answer0 nvarchar(2)', @answer0=N'XL'

但是,如果我在下面簡單地用XL替換@ answer0,我會返回4行。

exec sp_executesql N'SELECT IDWebFormAnswer FROM WebFormAnswers WHERE IDWebform = 55 AND IDWebFormQuestion = 478 AND (ANSWER = ''XL'')', N'@answer0 nvarchar(2)', @answer0=N'XL'

我不明白為什么會這樣? 我構建查詢錯了嗎?

使用參數時,不應將其括在引號中。 如果這樣做,那么參數名稱將成為文字字符串。 使用您的代碼,查詢將搜索包含值“@ Answer0”的ANSWER,但沒有。

 exec sp_executesql N'SELECT IDWebFormAnswer FROM WebFormAnswers 
      WHERE IDWebform = 55 AND IDWebFormQuestion = 478 AND 
      (ANSWER = @answer0)', N'@answer0 nvarchar(2)', @answer0=N'XL'

Steve已經很好地回答了這個問題,所以我會嘗試提供一些技巧,這些技巧是我在使用Dynamic SQL時遇到的幾個故障。 希望它有用。

首先用所有參數聲明寫出你的查詢

DECLARE @answer0 nvarchar(2)

SELECT IDWebFormAnswer
FROM WebFormAnswers
WHERE IDWebform = '55'
  AND IDWebFormQuestion = '478'
  AND (ANSWER = @answer0)

現在用2個單引號替換所有單引號(我使用CTRL + H,替換'with'')

DECLARE @answer0 nvarchar(2)

SELECT IDWebFormAnswer
FROM WebFormAnswers
WHERE IDWebform = ''55''
  AND IDWebFormQuestion = ''478''
  AND (ANSWER = @answer0)

下一步中斷此查詢並使用前導和尾隨單引號進行封裝,並與sp_executesql語法集成。

DECLARE @SQLString nvarchar(500),
        @ParmDefinition nvarchar(500),
        @ParmValue1 nvarchar(2);

 /* Build the SQL string one time.*/
SET @SQLString = N'SELECT IDWebFormAnswer
                   FROM WebFormAnswers
                   WHERE IDWebform = ''55''
                     AND IDWebFormQuestion = ''478''
                     AND (ANSWER = @answer0)';


SET @ParmDefinition = N'@answer0 nvarchar(2)';

 /* Execute the string with the first parameter value. */
SET @ParmValue1 = N'XL';

EXECUTE sp_executesql @SQLString, @ParmDefinition,
                       @answer0 = @ParmValue1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM