Недокументированная системная процедура sp_MSforeachtable и параметр @whereand - PullRequest
4 голосов
/ 10 июня 2009

Я пытаюсь использовать недокументированную системную процедуру 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.

Ответы [ 5 ]

3 голосов
/ 10 июня 2009

Это должно работать в SQL Server 2000 (сейчас не могу проверить):

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

Используйте OBJECTPROPERTY , чтобы найти идентификатор владельца схемы.

Редактировать: ОК, проверено на SQL 2000 box:

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

Я не могу заставить OBJECTPROPERTY работать

3 голосов
/ 10 июня 2009

Обновление для SQL2000:

declare @s nvarchar(1000)
set @s = ' and uid = ' + convert(nvarchar, user_id('my_schema'))
exec sp_msforeachtable @command1='print ''?''', @whereand = @s
1 голос
/ 10 июня 2009

С здесь :

---------------------
--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_%'"
---------------------
0 голосов
/ 06 февраля 2013

Это сработало в 2008 году R2

@ whereand = 'и uid = (ВЫБРАТЬ schema_id ОТ sys.schemas WHERE name =' 'dbo' ') и o.name LIKE' 'TEMP _%' ''

0 голосов
/ 11 июня 2009

Эта версия работает в 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'' '
...