2016-04-29 83 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

良好的通话。感谢您的建议 –