【问题标题】:SMO - How to script an object in a Dynamic SQL style? (IF NOT EXISTS)SMO - 如何以动态 SQL 样式编写对象脚本? (如果不存在)
【发布时间】:2019-06-07 09:51:16
【问题描述】:

当我使用 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

【问题讨论】:

  • 因此,如果 proc 已经存在并且具有与脚本定义不同的定义,您想保留旧定义而不是更改它以匹配脚本定义?我很好奇你的用例。
  • 我的用例是我想根据参数创建同一过程的两个不同版本,因此我将用不同的条件替换 IF CONDITION。

标签: sql-server smo


【解决方案1】:

对于任何感兴趣的人,使用 SQL 2008 SMO 程序集生成具有动态 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2023-03-27
    • 2013-10-26
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多