4

文書化されていないシステム プロシージャsp_MSforeachtableを使用しようとしています。しかし、影響を受けるテーブルを、" smp" で始まり、" dbo" スキーマにあるテーブルに制限する必要があります。「smp」で始まる手続きの探し方を見つけることができました。私は単に行います:

sp_MSforeachtable @command1=' print ''?''', @whereand=' and name like ''smp%''  '

@whereandしかし、パラメータを使用して特定のスキーマをフィルタリングするにはどうすればよいですか?

更新:次のことを試しましたが、うまくいきませんでした:

sp_MSforeachtable @command1=' print ''?''', @whereand=' and name like ''smp%'' and Left(''?'', 5)=''[dbo]'' '

更新 2 : SQL Server 2000 で実行しています。

4

5 に答える 5

3

これは SQL Server 2000 で動作するはずです (現在テストできません)。

@whereand = '
  AND name like ''smp%'' AND
  OBJECTPROPERTY(OBJECT_ID(''name''), ''OwnerID'') = USER_ID(''dbo'')'

OBJECTPROPERTYを使用して、スキーマ所有者 ID を見つけます。

編集:OK、SQL 2000ボックスでテストしました:

@whereand = ' AND name LIKE ''smp%'' AND uid = 1'
OR
@whereand = ' AND name LIKE ''smp%'' AND USER_ID(''dbo'')'

OBJECTPROPERTY を機能させることができませんでした

于 2009-06-10T18:52:59.737 に答える
3

SQL2000 の更新:

declare @s nvarchar(1000)
set @s = ' and uid = ' + convert(nvarchar, user_id('my_schema'))
exec sp_msforeachtable @command1='print ''?''', @whereand = @s
于 2009-06-10T18:37:27.460 に答える
1

ここから:

---------------------
--Drop table of particular shcemaID/shemaName and with name starting with 'Temp_'
Exec sp_MSforeachtable @command1 = "DROP TABLE ? PRINT '? dropped'"
    ,@whereand = "and uid = (SELECT schema_id FROM sys.schemas WHERE name = 'dbo')
                  and o.name LIKE 'Temp_%'"
---------------------
于 2009-06-10T18:38:55.647 に答える
0

このバージョンは Sql Server 2005 で動作します:

exec sp_MSforeachtable
    @command1=' print ''?''',
    @whereand=' and schema_name(schema_id) = ''dbo'' '

Sql Server 2000 については正確にはわかりませんが、このバージョンは機能する可能性があります。

exec sp_MSforeachtable
    @command1=' print ''?''',
    @whereand=' and user_name(uid) = ''dbo'' '
于 2009-06-11T04:41:29.867 に答える