存储过程在where子句中连接两个参数

时间:2016-04-29 07:41:54

标签: sql

我遇到了一个恼人的问题,我将两个参数传递给存储过程并将它们连接在一起,以便在我的语句的WHERE子句中使用。第一个参数用于equals表达式,而第二个参数用于形成AND子句。

存储过程的以下摘录显示了我正在尝试做的事情。

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 =@CombinedWhereClause

如果我只用@Sender替换@CombinedWhereClause,那么我会收回预期的记录。如果我将where子句更改为:

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

然后我得到所有10天的记录。但是,当合并时我没有结果。

1 个答案:

答案 0 :(得分: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);