Выбор из таблицы, где имя передается как переменная - PullRequest
0 голосов
/ 09 ноября 2010

Я пытаюсь написать простой хранимый процесс, который принимает три аргумента: «имя базы данных один», «имя базы данных два» и «имя таблицы».Затем sql выполнит подсчет строк для определенной таблицы в каждой базе данных и сохранит ее.

Работа над ней по частям Я столкнулся с первой проблемой, которую вы не можете сделать

select * from @tablename

Я знаю, что вы можете использовать динамический sql с командой exec, но это не идеально, поскольку я не могу возвращать значения.

Следующий пример выглядит так, как будто он должен работать, но не работает.

declare @tablename as nvarchar(500)
declare @sqlstring as nvarchar(500)
declare @parmdefinition as nvarchar(500)
declare @numrows as bigint

set @tablename = N'dummy_customer'

set @parmdefinition = N'@tablenameIN nvarchar(500), @numrowsOUT as bigint OUTPUT'

select @sqlstring = 'select @numrowsOUT = count(*) from @tablenameIN'

select @sqlstring

exec sp_executesql @sqlstring, @parmdefinition, @tablenameIN = @tablename, @numrowsOUT = @numrows OUTPUT

select @numrows

Сообщение об ошибке:

Msg 1087, Level 16, State 1, Line 1
Must declare the table variable "@tablenameIN".

В настоящее время используется SQL Server 2008 с пакетом обновления 2 (SP2).

Редактировать: мы делаем это, потому что выполняем миграцию, а клиент хочетотчет, который показывает количество строк для каждой таблицы в исходной и целевой базе данных.Поскольку существует много таблиц, возможность использовать sp_MSForEachTable для вызова хранимого процесса кажется идеальной.

Редактировать:

Окончательное решение для будущей ссылки -

declare @tablename as nvarchar(500)
declare @sqlstring as nvarchar(500)
declare @parmdefinition as nvarchar(500)
declare @numrows as bigint

set @tablename = N'dummy_customers'

set @parmdefinition = N'@tablename nvarchar(500), @numrowsOUT as bigint OUTPUT'

select @sqlstring = 'select @numrowsOUT = count(*) from ' + quotename(@tablename)

exec sp_executesql @sqlstring, @parmdefinition, @tablename = @tablename, @numrowsOUT = @numrows OUTPUT

select @numrows

1 Ответ

6 голосов
/ 09 ноября 2010

Вы должны использовать динамический sql и объединить имя таблицы в строку SQL, чтобы затем выполнить через sp_executsql:

select @sqlstring = 'select @numrowsOUT = count(*) from ' + QUOTENAME(@tablename)
EXECUTE sp_executesql ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...