Создание хранимой процедуры, если она еще не существует, но не изменяйте и не удаляйте существующую - PullRequest
0 голосов
/ 26 мая 2020

Я нашел примеры, в которых хранимая процедура удаляется или изменяется, если она существует.

Но как мне написать пакетный сценарий T- SQL, который выполняет строго следующее:

  • проверяет, существует ли хранимая процедура:
    • если она существует, сценарий вообще ничего не делает - я не хочу отбрасывать и переписывать или изменять существующую процедуру, потому что в нее могли быть внесены изменения кем-то еще. Кроме того, сценарий не должен прерываться с ошибкой, потому что он может быть частью более крупного пакета изменений.
    • если он не существует, только затем создайте новую процедуру с моим кодом

?

1 Ответ

2 голосов
/ 26 мая 2020

При создании хранимой процедуры это может быть единственный оператор в пакете. Это означает, что что-то вроде следующего не удастся:

IF NOT EXISTS(SELECT 1 FROM sys.schemas s JOIN sys.procedures p ON s.schema_id = p.schema_id WHERE s.[name] = N'dbo' AND p.[name] = N'YourProcedure') BEGIN

    CREATE PROC dbo.YourProcedure @TableName sysname AS
    BEGIN

        SELECT *
        FROM sys.tables t
        WHERE t.name = @TableName;

    END;
END;

Следовательно, если вы хотите сначала проверить, существует ли процедура, а затем создать ее, если нет, вы должны использовать «Dynami c» SQL (на самом деле это не динамический c, так как в нем нет ничего динамического c):

IF NOT EXISTS(SELECT 1 FROM sys.schemas s JOIN sys.procedures p ON s.schema_id = p.schema_id WHERE s.[name] = N'dbo' AND p.[name] = N'YourProcedure') BEGIN

    EXEC sys.sp_executesql N'CREATE PROC dbo.YourProcedure @TableName sysname AS
BEGIN

    SELECT *
    FROM sys.tables t
    WHERE t.name = @TableName;

END;';
END;

Это означает, что вам нужно будет избегать любых одинарных кавычек в определении хранимой процедуры при его вставке в оператор Dynami c.

...