2011-10-21 28 views
15

我知道sp_msforeachtable允許在所有表上執行查詢。如何從sp_msforeachtable中排除表格

我有100個表,我想對97個表執行相同的查詢。

我使用這個查詢:EXEC sp_MSForEachTable "DELETE FROM ?"

是否可以排除某些表?

回答

33
EXEC sp_MSforeachtable 'IF OBJECT_ID(''?'') NOT IN (
                ISNULL(OBJECT_ID(''[dbo].[T1]''),0), 
                ISNULL(OBJECT_ID(''[dbo].[T2]''),0) 
                ) 
         DELETE FROM ?' 
+0

+1 - 我的答案:)的更優雅版 – JNK

4

sp_MSforeachtable是無證的過程,但通過例如根據:http://avinashkt.blogspot.ru/2008/05/useful-operations-with-spmsforeachtable.html,你可以提供額外的第二個參數@whereand限制表的清單。


這會追加到下面的查詢。

SELECT '[' + REPLACE(schema_name(syso.schema_id), N']', N']]') + ']' 
     + '.' 
     + '[' + REPLACE(object_name(o.id), N']', N']]') + ']' 
FROM dbo.sysobjects o 
     JOIN sys.all_objects syso 
     ON o.id = syso.object_id 
WHERE OBJECTPROPERTY(o.id, N'IsUserTable') = 1 
     AND o.category & ltrim(str(CONVERT(INT, 0x0002))) = 0 

所以例如語法將

EXEC sp_MSforeachtable @command1 = N'PRINT ''?'' ', 
          @whereand = 'AND o.id NOT IN (
                ISNULL(OBJECT_ID(''[dbo].[T1]''),0), 
                ISNULL(OBJECT_ID(''[dbo].[T2]''),0) 
                 )' 
+0

+1我添加了更多細節和示例。 –

2

我碰到包含或排除的模式和表最簡單的語法:

exec sp_MSforeachtable 'print ''?''', 
@whereand='and Schema_Id=Schema_id(''Value'') and o.Name like ''%Value%'''