2010-11-09 7 views
0

J'essaye d'écrire un proc stocké simple qui prend trois arguments «nom de base de données un», «nom de base de données deux» et «nom de table». Le sql effectuera ensuite un nombre de lignes pour la table définie dans chaque base de données et le stocker.Sélection d'une table où le nom est passé en tant que variable

travail sur coup par coup j'ai frappé le premier problème que vous ne pouvez pas faire

select * from @tablename 

Je sais que vous pouvez utiliser SQL dynamique avec la commande exec mais ce n'est pas idéal que je ne peux pas revenir valeurs.

L'exemple suivant semble fonctionner mais ne fonctionne pas.

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 

Le message d'erreur est donné

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

actuellement en utilisant SQL Server 2008 SP2. Nous procédons ainsi parce que nous effectuons une migration et que le client souhaite un rapport indiquant le nombre de lignes pour chaque table dans la base de données source et de destination. Comme il existe de nombreuses tables pouvant utiliser sp_MSForEachTable pour appeler le proc stocké semble idéal.

Edit:

La solution finale pour référence future est

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 

Répondre

6

Vous auriez à utiliser SQL dynamique et concaténer le nom de la table dans la chaîne SQL pour exécuter ensuite par sp_executsql:

select @sqlstring = 'select @numrowsOUT = count(*) from ' + QUOTENAME(@tablename) 
EXECUTE sp_executesql .... 
+0

Cela fonctionne parfaitement. Je vous remercie. – JamieDainton

Questions connexes