use*_*076 22 sql sql-server sp-msforeachtable
我知道sp_msforeachtable允许对所有表执行查询.
我有100个表,我想在97个表上执行相同的查询.
我正在使用此查询: EXEC sp_MSForEachTable "DELETE FROM ?"
是否可以排除某些表格?
Mar*_*ith 44
EXEC sp_MSforeachtable 'IF OBJECT_ID(''?'') NOT IN (
ISNULL(OBJECT_ID(''[dbo].[T1]''),0),
ISNULL(OBJECT_ID(''[dbo].[T2]''),0)
)
DELETE FROM ?'
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以示例语法是
EXEC sp_MSforeachtable @command1 = N'PRINT ''?'' ',
@whereand = 'AND o.id NOT IN (
ISNULL(OBJECT_ID(''[dbo].[T1]''),0),
ISNULL(OBJECT_ID(''[dbo].[T2]''),0)
)'
Run Code Online (Sandbox Code Playgroud)
我遇到的最简单的语法包括或不包括模式和表:
exec sp_MSforeachtable 'print ''?''',
@whereand='and Schema_Id=Schema_id(''Value'') and o.Name like ''%Value%'''
Run Code Online (Sandbox Code Playgroud)