2012-03-30 9 views
4

Ich möchte eine dynamische Abfrage drucken, um eine Prozedur für alle Tabellen in der Datenbank auszuführen. Dies ist, was ich bisher geschrieben -sp_MSforceable, um die Prozedur für jede Tabelle auszuführen

EXEC SP_MSFOREACHTABLE ' 
    IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE COLUMN_NAME="EMAIL_S" AND TABLE_NAME=PARSENAME("?",1)) 
    BEGIN 
     PRINT ''EXEC DROPCONSTANT @TBLNAME=''+PARSENAME("?",1) 
        +'', @FLDNAME=''''EMAIL_S'''' '' 
     PRINT CHAR(10)+CHAR(13) 
    END 
' 

Der Ausgang ist nicht das, was ich erwarte, dass es sein -

EXEC DROPCONSTANT @TBLNAME=bill, @FLDNAME='EMAIL_S' 

Aber was ich wirklich will es -

EXEC DROPCONSTANT @TBLNAME='bill', @FLDNAME='EMAIL_S' 
+2

aussieht @ Aaron Antwort deckt diese ziemlich gut, aber wenn Sie benötigen tun 'sp_MSForeachtable' in die Zukunft, es hat einen [Parameter] (http://stackoverflow.com/a/9680217/15498), mit der Sie die Tabellen filtern können, gegen die sie tatsächlich ausgeführt wird. –

Antwort

3

Sie muss eine Reihe von ' hinzufügen.

PRINT ''DROPCONSTANT @TBLNAME=''''''+PARSENAME("?",1)+'''''', @FLDNAME=''''EMAIL_S'''' '' 
+0

Das funktioniert gut. Ich konnte einfach nicht herausfinden, dass wir 6 Zitate brauchen. –

7

Wie wäre es damit statt:

DECLARE @output NVARCHAR(MAX) = N''; 

SELECT @output += CHAR(13) + CHAR(10) 
    + 'EXEC DROPCONSTANT @TBLNAME=''' + t.name + ''',' 
    + '@FLDNAME=''EMAIL_S'';' 
    FROM sys.tables AS t 
    INNER JOIN sys.columns AS c 
    ON t.[object_id] = c.[object_id] 
    WHERE c.name = 'EMAIL_S'; 

SELECT @output; 
-- EXEC sp_executesql @output; 
Verwandte Themen