2014-02-26 29 views
0

我试图获取表中具有特定值的行数,如果count为0,则在表中添加一个值。此计数是存储过程中的局部变量。动态构建select语句并使用它来填充存储过程变量

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

然后,使用EXEC我正在运行此SQL,如下所示,希望填充计数变量。

但它不工作。

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 
+0

以何种方式是不工作?你有错误吗?你是否得到了与预期不同的结果? –

+0

这应该有助于我相信:http://stackoverflow.com/questions/6968512/assign-result-of-dynamic-sql-to-variable – Marc

+0

尝试使用'@ count'作为'OUT'参数,[this ](http://stackoverflow.com/questions/1589466/execute-stored-procedure-with-an-output-parameter)可能会有所帮助。在'@count = EXEC @ qry'上的 – user2989408

回答

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... 

来源:阿龙贝特朗的答案heresp_executesql解释..

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 
+0

但在if'动态sql未执行之前。我想,还是这样? – user1889838

+0

但它并不是必需的,因为您在@count变量中可用的记录数。 –

0

我认为@qry需要为执行字符串,而不是选择的结果,就像这样:

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; 
相关问题