.NET SMO 存储过程脚本神秘地发生了变化

本文关键字:发生了 变化 SMO 存储过程 脚本 NET | 更新日期: 2023-09-27 18:33:04

我们一直在使用 .NET 的 SQL Server 管理对象 (SMO) 来维护我们的数据库脚本(用作安装和升级脚本)。 对于某些存储过程,我们希望具有默认实现,以后可以由客户自行决定对其进行自定义。 因此,在我们的安装/升级脚本中,我们有类似的东西:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[STORED_PROC_NAME]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[STORED_PROC_NAME] @yada varchar(50),....
AS
BEGIN
     yada yada yada definition here is within the string passed to executesql
END'
END

请注意整个定义在传递给sp_executesql的字符串中的位置。

这很有效,因为如果过程已经存在,则不会更改该过程。 但是,在过去几天内的某个时候,SMO 生成的脚本已更改为以下格式:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[STORED_PROC_NAME]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[STORED_PROC_NAME] AS'
END
GO
ALTER PROCEDURE [dbo].[STORED_PROC_NAME] @yada varchar(50), ...
BEGIN
     yada yada yada this definition is now non-dynamic sql
END

从可读性的角度来看,这显然更干净,因为过程定义不在字符串中,但现在此脚本将更改已存在的存储过程。 发生了什么变化? 生成以下脚本的代码:

Scripter scrp = new Scripter(serv);
scrp.Options.IncludeIfNotExists = true;  //important
scrp.Options.NoCollation = true;
scrp.Options.Encoding = Encoding.Unicode;
scrp.Options.Bindings = true;
scrp.Options.ClusteredIndexes = true;
scrp.Options.DriChecks = true;
scrp.Options.DriClustered = true;
scrp.Options.DriDefaults = true;
scrp.Options.DriForeignKeys = false;
scrp.Options.DriIndexes = true;
scrp.Options.DriNonClustered = true;
scrp.Options.DriPrimaryKey = true;
scrp.Options.DriUniqueKeys = true;
scrp.Options.FullTextIndexes = true;
scrp.Options.Indexes = true;
scrp.Options.NonClusteredIndexes = true;
scrp.Options.Triggers = false;

foreach (String s in scrp.Script(new Urn[] { source.StoredProcedures["STORED_PROC_NAME"].Urn }))
{
    file.WriteLine(s);
    file.WriteLine("GO");
}

.NET SMO 存储过程脚本神秘地发生了变化

假设您的代码没有更改,我将不得不猜测您引用的库已更改。您现在是否引用了不同版本的 SMO 库?

相关文章: