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