2010-11-22 7 views
0

J'ai l'impression que c'est un travail de base de données assez basique, mais ce n'est pas pour moi. J'essaye d'obtenir une liste de toutes mes tables de pierre tombale des tables de système et stocke les résultats dans un curseur. J'essaie ensuite d'effectuer une logique sur chacune de ces tables que j'ai du mal à faire.Comment passer par un curseur pour effectuer la logique sur plusieurs tables? (Les noms des tables sont dans le curseur)

Toute aide serait grandement appréciée.

Voici l'erreur que je reçois: doit déclarer la variable de table "@tablename"

Voici le code:

declare tombstonetables cursor for 
(select name from sys.objects 
where 
name like'%tombstone%' 
and type = 'U'--for user_table 
) 

Print 'Begin purging tombstone tables' 

declare @tablename varchar(250) 
open tombstonetables 

fetch next from tombstonetables into @tablename 

WHILE @@FETCH_STATUS = 0 
begin 
select * from @tablename--real logic goes here later 

fetch next from tombstonetables into @tablename 

end 
close tombstonetables 

deallocate tombstonetables 
+0

Je suis désolé si une partie de ma langue est syntaxiquement au large. –

Répondre

5

On dirait que vous devez utiliser Dynamic SQL

Voici une référence à une simple marche à travers http://www.mssqltips.com/tip.asp?tip=1160

Vous aurez probablement besoin de faire usage de sp_executesql

Voici un exemple simple d'utilisation dynamique SQL avec votre exemple

DECLARE @DynamicSQL nvarchar(100) 

WHILE @@FETCH_STATUS = 0 
begin 
SET @DynamicSQL = 'select * from ' + @tablename --real logic goes here later 
EXEC @DynamicSQL 
fetch next from tombstonetables into @tablename 

end 
+2

+1: Juste pour clarifier l'op, la seule façon d'utiliser les noms de variables comme noms de table est d'utiliser SQL dynamique. – NotMe

+0

Merci! Cela m'a aidé à résoudre le problème! –