sp_MSforeachtable在每个表上执行过程

sp_MSforeachtable在每个表上执行过程

问题描述:

我想打印一些动态查询以在数据库中的所有表上执行过程。这是我到目前为止已经写 -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:/ /*.com/a/9680217/15498),它允许您过滤它实际执行的表。 – 2012-03-30 12:15:01

你需要添加一堆'

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

这工作正常。只是无法弄清楚我们需要6个引号。 – 2012-03-30 11:48:49

,而不是如何:

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;