Передача результатов из операторов, построенных посредством конкатенации - PullRequest
1 голос
/ 04 августа 2011

Я пытаюсь выбрать количество строк в списке таблиц, который существует в виде столбца данных во временной таблице.Я попытался сделать это с помощью курсора, чтобы построить строку запроса, как показано ниже, но это не сработало, потому что, когда я пытаюсь выполнить оператор, он не может ссылаться на переменную @Rows, которая была объявлена ​​ранее в операторе.

Это первый метод, который я попытался потерпеть неудачу с ошибкой «Должен объявить скалярную переменную @Rows»

SELECT @SQL = N'SELECT @Rows = @Rows + '
SELECT @SQL = @SQL + N'(SELECT COUNT(*) FROM [dbo].[' + @Table + '] '
SELECT @SQL = @SQL + N'WHERE tran_date < ' + CONVERT(VARCHAR(20), @Bound, 101) + ')'

Затем я попробовал описанный ниже метод, который также не работал и завершился ошибкой синтаксиса

SELECT @SQL = N'(SELECT COUNT(*) FROM [dbo].[' + @Table + '] '
SELECT @SQL = @SQL + N'WHERE date < ' + CONVERT(VARCHAR(20), @Bound, 101) + ')'

SELECT @Rows = @Rows + EXEC(@SQL)

1 Ответ

2 голосов
/ 04 августа 2011

Используйте * sp_executesql * для передачи аргументов в динамический sql

DECLARE @Rows BIGINT

SELECT @SQL = N'SELECT @Rows = @Rows + '
SELECT @SQL = @SQL + N'(SELECT COUNT(*) FROM [dbo].[' + @Table + '] '
SELECT @SQL = @SQL + N'WHERE tran_date < ' + CONVERT(VARCHAR(20), @Bound, 101) + ')'

EXEC sp_executesql N'@Rows BIGINT', @SQL, @Rows = @Rows OUTPUT

Также я бы передавал @Bound аргументы в процедуру sp_executesql:

DECLARE @Rows BIGINT

SELECT @SQL = N'SELECT @Rows = @Rows + '
SELECT @SQL = @SQL + N'(SELECT COUNT(*) FROM [dbo].[' + @Table + '] '
SELECT @SQL = @SQL + N'WHERE tran_date < @Bound)'

EXEC sp_executesql N'@Bound DATETIME, @Rows BIGINT OUTPUT', @SQL, @Bound = @Bound, @Rows = @Rows OUTPUT

Таким образом, вы получаете преимуществокэширования плана запроса

DavidW:

Я получил некоторые синтаксические ошибки, но приведенные ниже сработали успешно.Спасибо, что указали мне в правильном направлении

SELECT @SQL = N'(SELECT @RowsOut = COUNT(*) FROM [dbo].[' + @Table + '] '
SELECT @SQL = @SQL + N'WHERE tran_date < CONVERT(DATETIME,@BoundIn))'

PRINT 'SQL:' + @SQL + ' Bound: ' + CONVERT(VARCHAR(12),@Bound,101)
EXEC sp_executesql @SQL, N'@BoundIN SQL_VARIANT, @RowsOut INT OUTPUT', @BoundIn = @Bound, @RowsOut = @Rows OUTPUT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...