2012-03-30 5 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

が見えます/stackoverflow.com/a/9680217/15498)、実際に実行されるテーブルをフィルタリングすることができます。 –

答えて

3

あなたは'の束を追加する必要があります。

これはどのように代わり
PRINT ''DROPCONSTANT @TBLNAME=''''''+PARSENAME("?",1)+'''''', @FLDNAME=''''EMAIL_S'''' '' 
+0

これは正常に動作します。ちょうど6つの引用符が必要だと分かりませんでした。 –

7

:/:アーロンの答えはかなりよく、これをカバーしていますが、将来的には、 `sp_MSForeachtable`が必要な場合は、それが[パラメータ](HTTPを持っている@のよう

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; 
関連する問題