SMO - 如何以动态 SQL 样式编写对象脚本? (如果不存在)

SMO - How to script an object in a Dynamic SQL style? (IF NOT EXISTS)

当我使用 SMO 编写 IncludeIfNotExists 设置为 true 的过程脚本时,它首先创建该过程,然后更改它。有没有办法让它以动态 SQL 样式创建过程? (就像在 SSMS 中一样)

这是我从 SMO 得到的:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_a]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[proc_a] AS' 
END
GO
ALTER PROCEDURE [dbo].[proc_a] 
AS
BEGIN 
-- etc..
END
GO

我想要这样的东西:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_a]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
CREATE PROCEDURE [dbo].[proc_a] 
AS
BEGIN
-- etc..

END
' 
END
GO

对于任何感兴趣的人,使用 SQL 2008 SMO 程序集生成带有 Dynamic-SQL 样式的代码,而使用 SQL 2017 生成带有 ALTER 语句的代码。

[System.Reflection.Assembly]::Load("Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
[System.Reflection.Assembly]::Load("Microsoft.SqlServer.SmoExtended, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
[System.Reflection.Assembly]::Load("Microsoft.SqlServer.Smo, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
[System.Reflection.Assembly]::Load("Microsoft.SqlServer.SmoExtended, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")