2012-03-30 59 views
4

我想打印一些動態查詢以在數據庫中的所有表上執行過程。這是我到目前爲止已經寫 -sp_MSforeachtable在每個表上執行過程

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 
' 

輸出是不是我希望它是 -

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

但我真正想要的 -

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

看起來像@阿龍的回答涵蓋了這還算不錯,但如果你確實需要'sp_MSForeachtable'在未來,它有一個[參數](HTTP:/ /stackoverflow.com/a/9680217/15498),它允許您過濾它實際執行的表。 – 2012-03-30 12:15:01

回答

3

你需要添加一堆'

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

這工作正常。只是無法弄清楚我們需要6個引號。 – 2012-03-30 11:48:49

7

,而不是如何:

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; 
相關問題