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'
答
你需要添加一堆'
。
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;
看起来像@阿龙的回答涵盖了这还算不错,但如果你确实需要'sp_MSForeachtable'在未来,它有一个[参数](HTTP:/ /stackoverflow.com/a/9680217/15498),它允许您过滤它实际执行的表。 – 2012-03-30 12:15:01