2012-03-28 22 views
0

我读过如何返回与动态SQL输出参数的几个例子,但都被强似他们(我在略有不同,他们创建的过程内的变量,假设这是我问题的根源)。我得到的错误:与输出参数语法清晰动态SQL

Must declare the table variable "@tbl". 

当我试图运行下面的程序(执行它的测试代码后列出)。我关门了吗?

DECLARE @tbl nvarchar(40) 
DECLARE @bnch INT 
SET @tbl = 'tblDailyPricingAndVol' 

EXEC sprocReturnDataPointBenchmark @tbl, @bnch 

存储过程:

ALTER PROCEDURE [dbo].[sprocReturnDataPointBenchmark] @tblName NVARCHAR(50), 
    @benchmark BIGINT OUTPUT 

AS 
BEGIN 

DECLARE @sql nvarchar(1000), 
@parameters NVARCHAR(100) = N'@tbl NVARCHAR(50), @benchOUT BIGINT OUTPUT'; 

SET @sql = N'SELECT @benchOUT = Count(ID) FROM @tbl WHERE DateAdded = ' + 
    '(SELECT MAX(DateAdded) FROM tblDailyATR AS T2)'; 

EXEC sp_executesql @sql, @parameters, @tbl = @tblName, @benchOUT = @benchmark OUTPUT 
SELECT @benchmark 

END 

回答

1

有一对夫妇在我第一遍语法错误上面列出的,但我需要解决试图在通过表名(输入参数)的概念问题动态sql中的参数变量。在这里很好的例子:Generate dynamic SQL statements in SQL Server

所以,我的修订,工作代码为:

ALTER PROCEDURE [dbo].[sprocReturnDataPointBenchmark] @tblName NVARCHAR(50), 
    @benchmark BIGINT OUTPUT 

AS 
BEGIN 

DECLARE @sqlStatement nvarchar(500) 
DECLARE @parameters NVARCHAR(100) 
DECLARE @fullStatement NVARCHAR(500) 

SET @parameters = '@benchmark BIGINT OUTPUT' 

SET @sqlStatement = N'SELECT @benchmark = Count(ID) FROM ' + @tblName + ' WHERE DateAdded = ' + 
    '(SELECT MAX(T2.DateAdded) FROM ' + @tblName + ' AS T2)'; 

EXEC sp_executesql @sqlStatement, @parameters, @benchmark = @benchmark OUTPUT 
SELECT @benchmark 

END