sp_MSforeachtable для выполнения процедуры на каждой таблице - PullRequest
4 голосов
/ 30 марта 2012

Я хочу напечатать некоторый динамический запрос для выполнения процедуры для всех таблиц в базе данных.Это то, что я написал до сих пор -

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 ]

7 голосов
/ 30 марта 2012

Как насчет этого вместо:

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;
3 голосов
/ 30 марта 2012

Вам нужно добавить связку '.

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