Зависимости хранимых процедур SQL Server 2005 - PullRequest
4 голосов
/ 07 июля 2010

У меня есть список хранимых процедур, и я пытаюсь определить порядок, в котором они должны быть реализованы.

Есть ли способ определить, как хранимые процедуры зависят друг от друга.Я думаю, что я мог бы использовать sysobjects и syscomments.

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 июля 2010

В одну сторону

EXEC sp_depends 'your_procedure_name'
1 голос
/ 07 июля 2010

Вот код, который я создал несколько недель назад, чтобы создать порядок объектов для применения к базе данных на основе их зависимостей.Первая хранимая процедура просто обновляет метаданные, так что вы можете быть уверены, что sql_dependencies будет точным.

Это не полностью протестированный код.Кроме того, я бы, вероятно, использовал INFORMATION_SCHEMA вместо прямого обращения к системным таблицам, если бы я сделал это снова.

Run_level сообщает вам, когда можно создать каждый объект.Итак, все объекты с run_level, равным 0, могут быть запущены вначале (порядок не имеет значения в пределах run_level), затем все объекты с run_level 1 и т. Д.

1 голос
/ 07 июля 2010

Вот статья о том, как создать UDF, которая будет делать это.Он использует таблицы sysobjects и syscomments, как вы предложили.

http://www.eggheadcafe.com/community/aspnet/13/12562/list-sql-stored-procedure.aspx

Вот SQL для UDF:

CREATE FUNCTION dbo.uf_FindProcedureDependencies(@ProcName varchar(256))
        RETURNS @blah TABLE (depth tinyint not null,
        tree varchar(7700) COLLATE SQL_Latin1_General_CP437_BIN not null,
        objectname varchar(256) COLLATE SQL_Latin1_General_CP437_BIN not null,
        dependencytype varchar(16) COLLATE SQL_Latin1_General_CP437_BIN not null)
AS
BEGIN
    DECLARE @depth tinyint
    SELECT @depth = 1

    INSERT @blah (depth, tree, objectname, dependencytype)
        SELECT DISTINCT @depth, @ProcName + ' -> ' + so2.name, so2.name, 'stored procedure' FROM 
            sysobjects so1, syscomments sc1, sysobjects so2, syscomments sc2 WHERE
            so1.id = sc1.id AND so2.id = sc2.id AND so1.id <> so2.id AND so1.type = 'P' AND so2.type = 'P'
            AND so1.name = @ProcName AND REPLACE(sc1.text,so1.name,'') LIKE '%EXEC%' + so2.name + '%'

    WHILE (@@ROWCOUNT > 0)
    BEGIN
        SET @depth = @depth + 1
        INSERT @blah (depth, tree, objectname, dependencytype)
            SELECT DISTINCT @depth, b.objectname + ' -> ' + so2.name, so2.name, 'stored procedure' FROM 
            sysobjects so1, syscomments sc1, sysobjects so2, syscomments sc2, @blah b WHERE
            so1.id = sc1.id AND so2.id = sc2.id AND so1.id <> so2.id AND so1.type = 'P' AND so2.type = 'P'
            AND so1.name = b.objectname AND REPLACE(sc1.text,so1.name,'') LIKE '%EXEC%' + so2.name + '%'
            AND b.depth = @depth - 1
    END

    RETURN
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...