2016-04-29 88 views
-1

我有一個令人討厭的問題,我將兩個參數傳遞給存儲過程並將它們連接在一起以便在我的語句的WHERE子句中使用。第一個參數用於等號表達式,而第二個用於形成AND子句。存儲過程在where子句中連接兩個參數

存儲過程的下面的提取,顯示了我正在嘗試做什麼。

Declare @CombinedWhereClause varchar(500), @Sender varchar(10), @AndClause char(200) 

Set @Sender = 'Wayne'; 
Set @AndClause = ' AND Convert(varchar(8), MessageDate, 112) < DATEADD(day, -10, GETDATE())'; 
Set @CombinedWhereClause = @Sender + @AndClause; 

SELECT Messages.Id, Messages.IdExternal, Messages.MessageReference, 
FROM Messages 
WHERE Messages.Sender [email protected] 

如果我用@Sender替換@CombinedWhereClause,那麼我就會找回預期的記錄。如果我將where子句更改爲:

WHERE Message.MessageDate Convert(varchar(8), MessageDate,112) < DATEADD(day, -10, GETDATE()) 

然後我得到所有10天的記錄。但是,當我結合時,我得不到任何結果。

+0

請標記的DBMS。 (這是產品特定的代碼。) – jarlh

+1

哪個RDBMS(供應商和版本)?你真的期望,數據庫引擎可以知道,你比較的字符串不是一個字符串,而是一個where子句的擴展名?這隻可能與動態SQL ... – Shnugo

+0

我假設SQL服務器,因爲'getdate()'和'convert()'語法。無論如何,我不知道可以結合常規sql和動態sql的rdbms。 –

回答

0

在你的說法有幾個缺陷:

  • 的MessageReference背後的逗號
  • 你嘗試有WHERE Messages.sender=Wayne但你需要引號...='Wayne'
  • 您認爲數據庫引擎是某種神奇:-)
  • 這是 - 當然! - 不應該選擇的辦法...

試試這個動態的方法(SQL Server語法)

Declare @CombinedWhereClause varchar(500), @Sender varchar(10), @AndClause char(200) 

Set @Sender = '''Wayne'''; --you need to wrap the word in quotes! 
Set @AndClause = ' AND Convert(varchar(8), MessageDate, 112) < DATEADD(day, -10, GETDATE())'; 
Set @CombinedWhereClause = @Sender + @AndClause; 

DECLARE @cmd VARCHAR(MAX)= 
'SELECT Messages.Id, Messages.IdExternal, Messages.MessageReference 
FROM Messages 
WHERE Messages.Sender =' + @CombinedWhereClause; 

--check the command 
SELECT @cmd; 

--if the command is OK you might execute it 
--EXEC(@cmd); 
+0

謝謝Shnugo。只需要將這一切都包裝到CTE功能中即可。 –

+0

@WayneAtherton,你真的想要什麼?這是動態的SQL,你不能把它全部包裝到一個CTE *中......可能有一個解決方案:創建一個物理(temp-)表並讓動態SQL成爲這個表的一個INSERT語句。然後,您可以使用「普通」查詢中的表格內容... – Shnugo

+0

良好的通話。感謝您的建議 –