动态构建select语句并使用它来填充存储过程变量

时间:2014-02-26 17:19:43

标签: sql stored-procedures

我试图在表中计算具有特定值的行,如果计数为0,则在表中添加一个值。此计数是存储过程中的局部变量。

我正在动态构建SQL并将SQL语句存储到nvarchar变量中。

然后,使用EXEC我按照以下方式运行此SQL,希望填充count变量。

但它不起作用。

DECLARE @qry NVARCHAR(max)
DECLARE @count INT

-- building @qry will result as follows
@qry = SELECT @count = COUNT(*) FROM aTable WHERE (col1 = @col1 AND ...)


@count = EXEC @qry
IF @count = 0
BEGIN
  -- carry on with adding
END

3 个答案:

答案 0 :(得分:1)

在你的sql中,为什么你要通过EXEC执行查询,因为你所需的输出已经在@count变量中,所以在你的情况下不需要。 请参考以下语法。

DECLARE @qry Numeric
DECLARE @count INT

-- building @qry will result as follows
SELECT @count = COUNT(*) FROM aTable WHERE (col1 = @col1 AND ...)

IF @count = 0
BEGIN
  -- carry on with adding
END

答案 1 :(得分:0)

我认为@qry需要是一个执行字符串,而不是select的结果,如下所示:

DECLARE @qry NVARCHAR(max);
DECLARE @count INT;

-- building @qry will result as follows
SET @qry = 'SELECT COUNT(*) FROM aTable WHERE (col1 = @col1 AND ...)';

SET @count = exec @qry;

答案 2 :(得分:0)

如果要动态构建查询,则需要sp_executesql。尝试像

这样的东西
-- building @qry will result as follows
@qry = 'SELECT @count = COUNT(*) FROM aTable WHERE (col1 = @col1 AND ...)'

EXEC sp_executesql @qry, N'@count INT OUTPUT', @count OUTPUT;
--Do whatever you want with @count...

来源:Aaron Bertrand的回答heresp_executesql解释..