【问题标题】:sp_MSforeachtable to execute procedure on each tablesp_MSforeachtable 在每个表上执行过程
【发布时间】:2012-03-30 11:38:05
【问题描述】:

我想打印一些动态查询来对数据库中的所有表执行一个过程。这是我到目前为止写的 -

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'

【问题讨论】:

  • 看起来@Aaron 的回答很好地涵盖了这一点,但是如果您将来确实需要sp_MSForeachtable,它有一个parameter 可以让您过滤它实际执行的表。

标签: sql sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:

这个怎么样:

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;

【讨论】:

    【解决方案2】:

    你需要添加一堆'。

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

    【讨论】:

    • 这很好用。只是想不通我们需要 6 个引号。
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2017-03-28
    • 2017-11-01
    相关资源
    最近更新 更多