SQL Iterate sur toutes les tables

Je cours le code suivant pour extraire toutes les lignes pertinentes de toutes les tables qui ont une colonne particulière. L' IF externe est supposé vérifier si la colonne existe sur la table pour cette itération. Sinon, il devrait terminer cette itération et passer à la table suivante. Si la table contient la colonne GCRecord , elle doit alors vérifier si cette table renverra des loggings. S'il n'y a aucun logging à renvoyer, il doit terminer cette itération et passer à la table suivante. S'il existe des loggings, ils doivent les afficher dans SSMS.

 USE WS_Live EXECUTE sp_MSforeachtable ' USE WS_Live IF EXISTS( SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'') AND Name = ''GCRecord'' ) BEGIN IF EXISTS (SELECT * FROM ? WHERE GCRecord IS NOT NULL) BEGIN SELECT * FROM ? WHERE GCRecord IS NOT NULL END END ' 

Cela semble fonctionner parce que SSMS ne renvoie que des grids avec des inputs valides. Ce que je ne comprends pas est: Pourquoi ai-je encore ces erreurs?

 Msg 207, Level 16, State 1, Line 10 Invalid column name 'GCRecord'. Msg 207, Level 16, State 1, Line 13 Invalid column name 'GCRecord'. 

MODIFIER

Après avoir utilisé les suggestions, j'ai ceci:

 USE WS_Live EXECUTE sp_MSforeachtable ' USE WS_Live IF EXISTS(SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'')AND Name = ''GCRecord'') BEGIN IF EXISTS (SELECT * FROM ? WHERE GCRecord IS NOT NULL) BEGIN EXEC('' SELECT * FROM ? WHERE GCRecord IS NOT NULL'') END END ' 

Qui renvoie cette erreur:

 Msg 207, Level 16, State 1, Line 7 Invalid column name 'GCRecord'. 

Ce qui fait reference à cette ligne

 IF EXISTS(SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'')AND Name = ''GCRecord'') 

METTRE À JOUR

J'ai essayé d'imbriquer des instructions EXEC qui n'ont pas fonctionné, mais en utilisant la réponse choisie, j'ai obtenu les résultats que je recherchais sans les erreurs.

Utiliser la requête dynamic à l'intérieur pour commencer à éviter la pré-compilation interne du code, car les tables ne contiennent pas la colonne ' GCRecord '

 USE WS_Live GO EXECUTE sp_MSforeachtable ' IF EXISTS( SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'') AND Name = ''GCRecord'' ) BEGIN EXEC('' IF EXISTS (SELECT * FROM ? WHERE GCRecord IS NOT NULL) BEGIN SELECT * FROM ? WHERE GCRecord IS NOT NULL END '') END ' 

Vous êtes très proche. Utilisez "EXEC"

 USE WS_Live EXECUTE sp_MSforeachtable ' USE WS_Live IF EXISTS( SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'') AND Name = ''GCRecord'' ) BEGIN EXEC(''SELECT * FROM ? WHERE GCRecord IS NOT NULL'') END ' 

S'il vous plaît essayez ce SQL dynamic. supprimer le commentaire d' exec lorsque vous êtes prêt à courir

 declare @t varchar(max) = '' SELECT @t = @t + 'SELECT * FROM ' + a.name + ' WHERE GCRecord IS NOT NULL;' + char(13) FROM sys.columns b join sys.objects a on b.Object_ID = a.Object_ID WHERE b.Name ='CreateDt' Print @t --exec (@t) 

Utilisez @whereand pour simplifier:

 exec sp_MSforeachtable @command1='select * from ? where GCRecord is not null', @whereand='and exists(select 1 from sys.columns c where c.object_id = o.id and c.name = ''GCRecord'')'