2012-03-28 10 views
0

Ich habe mehrere Beispiele gelesen, wie man einen Ausgabeparameter mit dynamischem sql zurückgibt, aber alle waren etwas anders, weil sie die Variable innerhalb der Prozedur erzeugten, anstatt sie (I nehme an, das ist die Wurzel meines Problems). Ich erhalte den Fehler:Dynamische SQL mit Ausgabeparameter Syntax Klarheit benötigt

Must declare the table variable "@tbl". 

Wenn ich versuche, die folgende Prozedur auszuführen (aufgeführt nach dem Testcode, der es ausführt). Bin ich in der Nähe?

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

EXEC sprocReturnDataPointBenchmark @tbl, @bnch 

sproc:

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 

Antwort

1

Es gab ein paar syntaktische Fehler in meinem ersten Durchgang oben aufgeführt, aber die grundlegende Frage, die ich zu lösen benötigt wurde versucht, die Tabellennamen (Eingabeparameter) passiert in die Parametervariable innerhalb der dynamischen SQL. Gutes Beispiel hier: Generate dynamic SQL statements in SQL Server

Also, meine überarbeitet, Arbeitscode lautet:

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