Используйте * 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