ScriptingOptions sql smo 不支持脚本数据

Posted

技术标签:

【中文标题】ScriptingOptions sql smo 不支持脚本数据【英文标题】:ScriptingOptions sql smo does not support scripting data 【发布时间】:2016-08-28 10:23:15 【问题描述】:

我正在使用 c# 代码生成 sql 数据库脚本。

以下代码适用于 create table,但当我尝试使用 scriptOptions.ScriptData = true; 时,它会引发以下异常。

未处理的类型异常 'Microsoft.SqlServer.Management.Smo.FailedOperationException' 发生 在 Microsoft.SqlServer.Smo.dll 中

附加信息:此方法不支持脚本数据。

代码

 public static string ScriptDatabase(string dbConnectionString, string databaseName)
        

            SqlConnection conn = new SqlConnection(dbConnectionString);
            ServerConnection serverConn = new ServerConnection(conn);
            var server = new Server(serverConn);
            var database = server.Databases[databaseName];

            var scripter = new Scripter(server);
           // I tried this code also       
           // scripter.Options.ScriptData = true;
            ScriptingOptions scriptOptions = new ScriptingOptions();
            scriptOptions.ScriptDrops = false;
            scriptOptions.ScriptData = true;
            scriptOptions.ScriptSchema = true;


            scriptOptions.IncludeIfNotExists = true;
            string scrs = "";
            string tbScr = "";
            foreach (Table myTable in database.Tables)
            
                /* Generating IF EXISTS and DROP command for tables */
                StringCollection tableScripts = myTable.Script(scriptOptions);
                foreach (string script in tableScripts)
                    scrs += script + "\n\n";

                /* Generating CREATE TABLE command */
                tableScripts = myTable.Script();
                foreach (string script in tableScripts)
                    tbScr += script + "\n\n";
            
 return (scrs + "\n\n" + tbScr);

【问题讨论】:

在每个单独的表上尝试 Scripter.EnumScript(database.Tables) 而不是 Table.Script()。 (免责声明:未经测试。) @JeroenMostert 不适合我可能是我使用错误,你能帮我写代码吗.. 谢谢 【参考方案1】:

以下测试:

Win 7.0、.NET 4.0、VS 2010、SQL Server 2008R2 Win 7.0、.NET 4.6.1、VS 2017、SQL Server 2014

所需的程序集引用:

Microsoft.SqlServer.ConnectionInfo Microsoft.SqlServer.Management.Sdk.Sfc Microsoft.SqlServer.Smo

我用 OK 按钮创建了一个简单的 Win forms 应用程序并调用了下面的函数。

注意:如果脚本化视图需要添加

if( myView.IsSystemObject == true ) continue;

确保系统视图没有被编写脚本;我没有测试过这个。对于旧版本的 SQL Server,您可能还需要对表进行此检查。

public static string ScriptDatabase( string dbConnectionString, string databaseName )

    SqlConnection conn = new SqlConnection( dbConnectionString );
    ServerConnection serverConn = new ServerConnection( conn );
    var server = new Server( serverConn );
    var database = server.Databases[ databaseName ];

    var scripter = new Scripter( server );
    scripter.Options.IncludeIfNotExists = true;
    scripter.Options.ScriptSchema = true;
    scripter.Options.ScriptData = true;

    string scrs = "";
    foreach( Table myTable in database.Tables )
    
        foreach( string s in scripter.EnumScript( new Urn[]  myTable.Urn  ) )
            scrs += s + "\n\n"; ;
    
    return ( scrs );

函数调用如下:

// Connection string for local SQL Server default instance
ScriptDatabase( "Server=.;Database=PlayGround;Trusted_Connection=True;", "PlayGround" );

输出:

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tBlah]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[tBlah](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [tID] [varchar](20) COLLATE Latin1_General_CI_AS NULL,
    [Value] [varchar](20) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]
END

SET IDENTITY_INSERT [dbo].[tBlah] ON 


INSERT [dbo].[tBlah] ([ID], [tID], [Value]) VALUES (1, N'2', N'1234')

INSERT [dbo].[tBlah] ([ID], [tID], [Value]) VALUES (2, N'2', N'345.6')

MSDN 参考资料:

Microsoft.SqlServer.Management.Smo.Scripter Microsoft.SqlServer.Management.Common.ServerConnection Microsoft.SqlServer.Management.Smo.Server Microsoft.SqlServer.Management.Smo.Database

2019 年 12 月 17 日更新:检查最新的 .NET 版本;添加了所需的参考资料;清理示例代码;添加示例连接字符串

【讨论】:

@Kiquenet - 看起来没有办法:***.com/questions/35358122/… Assemblies and namespaces ? Microsoft.SqlServer.Smo ? 不工作,我在 C# 中尝试过相同的代码,但它没有给我插入查询的数据脚本 @HardikMasalawala,我使用最新的 .NET 重新创建了解决方案,它确实有效。表格中有数据吗? 谢谢!你救了我! Table.Script 不适合我,但这个与 Scripter 一起工作!

以上是关于ScriptingOptions sql smo 不支持脚本数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:为啥要使用 SMO?

使用 SMO 重启 SQL Server 实例

sql 使用SMO重新启动Sql Server代理服务

SQL Server 管理对象 (SMO) 的默认约束不一致

使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题

使用 SQL SMO 修复孤立用户?