Я пытаюсь написать простой хранимый процесс, который принимает три аргумента: «имя базы данных один», «имя базы данных два» и «имя таблицы».Затем 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