По материалам статьи Brian Knight "SP_MSForeachtable - Life Without Cursors"
http://www.sqlservercentral.com/columnists/bknight/sp_msforeachtable.asp
Многие задачи, по привычке, решаются с помощью курсоров. Однако, в глубинах базы данных master скрыт ряд хранимых процедур,
которые могут заменить некоторые курсоры. Курсоры все еще будут использоваться, но новые возможности позволят Вам уделять
больше времени непосредственно для разработки.
Например, по традиции, если бы Вы захотите выполнить DBCC CHECKTABLE для каждой таблицы в базе данных, Вы можете написать
сложный курсор, подобный представленному ниже:
DECLARE @dataname varchar(255),
@dataname_header varchar(255)
DECLARE datanames_cursor CURSOR FOR SELECT name FROM master..sysdatabases
WHERE name not in ('master', 'pubs', 'tempdb', 'model')
OPEN datanames_cursor
FETCH NEXT FROM datanames_cursor INTO @dataname
IF (@@fetch_status = 0)
BEGIN
SELECT @dataname_header = "Database " + RTRIM(UPPER(@dataname))
PRINT @dataname_header
SELECT @dataname_header = RTRIM(UPPER(@dataname))
EXEC ("DBCC CHECKDB " + "(" + @dataname + ")")
END
CLOSE datanames_cursor
DEALLOCATE datanames_cursor
Начинаясь с версии 6.5 SQL Server, Микрософт ввёл хранимую процедуру, называемую sp_MSreachfortable. Используя символ
вопроса как указатель на список всех имён таблиц, процедура будет делать то же самое, что и вышеупомянутый курсор, но будет
умещаться только в одну строку. Вы можете заменять курсор следующей командой:
sp_MSforeachtable @command1="print '?' dbcc checktable ('?')"
Вы можете использовать до трех команд в этой хранимой процедуре, используя @command1, @command1 и @command3.
Перевод: Александр Гладченко 2001г.
|