Динамический sql с ясностью синтаксиса выходного параметра - PullRequest
0 голосов
/ 29 марта 2012

Я прочитал несколько примеров того, как вернуть выходной параметр с динамическим sql, но все они немного отличались тем, что создали переменную внутри процедуры, а не передавали ее (я предполагаю, что это корень моя проблема). Я получаю ошибку:

Must declare the table variable "@tbl".

Когда я пытаюсь запустить описанную ниже процедуру (указывается после кода теста, который ее выполняет). Я рядом?

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

1 Ответ

1 голос
/ 29 марта 2012

В моем первом проходе было несколько синтаксических ошибок, перечисленных выше, но концептуальная проблема, которую мне нужно было решить, - попытка передать имя таблицы (входной параметр) в переменную параметров в динамическом sql. Хороший пример здесь: Создание динамических операторов SQL в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...