Sql 动态生成select语句并使用它填充存储过程变量

Sql 动态生成select语句并使用它填充存储过程变量,sql,stored-procedures,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

我试图获取表中具有特定值的行的计数,如果计数为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

在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

我认为@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;

如果要动态生成查询,则需要
sp\u 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...

来源:亚伦·伯特兰的回答和解释。

它在什么方面不起作用?你有错误吗?您得到的结果是否与您预期的不同?我相信这应该会有所帮助:尝试使用
@count
作为
OUT
参数进行操作,可能会有所帮助。在
@count=EXEC@qry
时,它会给我错误。“@count”附近的语法不正确。如果未执行动态sql,则在
之前。我猜是吧?但它不是必需的,因为您的记录计数在@count变量中可用。