.NET SMO 存储过程脚本神秘改变

.NET SMO stored procedure scripts mysteriously changed

我们一直在使用 .NET 的 Sql 服务器管理对象 (SMO) 来维护我们的数据库脚本(可用作安装和升级脚本)。对于一些存储过程,我们希望有默认的实现,以后可以根据客户的判断进行定制。所以,在我们的 install/upgrade 脚本中,我们有这样的东西:

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");
}

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