2012-03-30 2 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), который позволяет фильтровать таблицы, на которых он фактически выполняется. –

ответ

3

You необходимо добавить кучу '.

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

Это прекрасно работает. Просто не мог понять, что нам нужны 6 цитат. –

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; 
Смежные вопросы