【问题标题】:Script Table With Data from code使用代码中的数据编写表格脚本
【发布时间】:2013-06-24 17:42:51
【问题描述】:

在 SQL Server 2008 R2 中,用户可以通过右键单击数据库并选择 TasksGenerate Scripts 来编写包含数据的表。将弹出一个向导,询问用户他们想要什么(多个表、一个表等)以及一些高级选项(允许用户获取表模式和数据);如有问题,see this useful post of what's being done(在“The Handy”下)。

不幸的是,SQL Server 没有生成这些脚本的脚本,有时我们必须编写包含所有数据的表的脚本。我认为不是每次都手动执行此操作,而是让 C# 应用程序为测试表调用这些进程并为包含所有数据的表生成脚本并将其保存为本地文件会更容易。

当我使用SqlConnection 时,我没有看到执行此类任务的选项(尽管它可能与其他任务有关)。如何访问此向导?

更新:在最初的回答之后,我认为这是不可能的,所以我为那些更熟悉 TSQL 的人制定了一个有趣的解决方案。我创建了一个类似于下面的存储过程:

CREATE PROCEDURE usp_ScriptTableAndData
AS
BEGIN

    CREATE TABLE ScriptTemp(
        Value VARCHAR(8000)
    )

    INSERT INTO ScriptTemp
    SELECT '/*   Build the Reference Table   */'

    INSERT INTO ScriptTemp
    SELECT 'USE [DB]
        GO

        SET ANSI_NULLS ON
        GO

        SET QUOTED_IDENTIFIER ON
        GO

        SET ANSI_PADDING ON
        GO

        CREATE TABLE [dbo].[Table](
            [ID] [int] IDENTITY(1,1) NOT NULL,
            [Reference] [varchar](50) NULL,
            [TableDate] [datetime] NOT NULL,
            [Display] [bit] NULL
        )

        SET ANSI_PADDING OFF
        GO


        INSERT INTO ScriptTemp
        SELECT '/*   Insert the Table Values    */'

        INSERT INTO ScriptTemp
        SELECT 'INSERT INTO Table VALUES(' + CAST(ID AS VARCHAR(3)) + 
            ',' + '''' + LTRIM(RTRIM(ISNULL(Reference,'NULL'))) + '''' + 
            ',' + '''' + CONVERT(VARCHAR(25),TableDate,120) + '''' + 
            ',' + ISNULL(CAST(Display AS VARCHAR(4)),'NULL') + ')'
        FROM dbo.Table

        EXECUTE xp_cmdshell 'BCP "SELECT * FROM DB.dbo.ScriptTemp" queryout "\\FileSharePath\Script.sql" -T -c -SSERVER'

        DROP TABLE ScriptTemp
END

这将创建一个包含表和数据的脚本(我从Bill Fellows created 的类似脚本中得到这个想法)。无论如何,这个解决方案也有效,并且对于更熟悉 TSQL 的人来说非常方便。再次感谢所有回答的人。

【问题讨论】:

标签: c# sql-server ssms smo


【解决方案1】:

您应该查看SQL Server Management Objects (SMO)。我以前用它在 .NET 应用程序中创建自定义脚本,但我不确定它是否支持数据脚本。

来自 MSDN:

SQL Server 管理对象 (SMO) 是专为 Microsoft SQL Server 的程序化管理。您可以使用 SMO 构建定制的 SQL Server 管理应用程序。

【讨论】:

【解决方案2】:

向导是 SQL 管理控制台的一项功能,只能从那里使用。它不属于 SqlConnection 类或 .NET Framework 本身的任何部分。

这有点像在代码中实例化 Word 自动化对象时询问字体对话框在哪里。

【讨论】:

  • 它是 .Net 框架中 SMO 的一部分。这也是 SSMS 的工作方式(大部分情况下)。
  • @catfood 谢谢;在另一个答案之前,我认为这是不可能的,并花了几个小时设计自己的解决方案,这是一项具有挑战性的练习。
  • 我学到了一些关于 SMO 的知识。谢谢,RBarryYoung。抱歉误导了你,Question3CPO。
【解决方案3】:

脚本输出模式的功能不在 sql 库中,它在 Visual Studio 库中。

例如Microsoft.Data.Schema.ScriptDom.Sql、Microsoft.Data.Schema.ScriptDom;

视觉工作室团队 / 一个叫 Gert Drapers 的人 http://blogs.msdn.com/b/gertd/ 工作在一个叫做 Visual Studio Team System 2008 数据库版的东西上——它现在被遗忘了,但它仍然隐藏在 VS2010 和 VS2012 企业版中(或者现在所说的每个版本)。您可以比较数据库中的模式和数据,他们是如何做到的? 微软为此编写了大量的类,您可以使用它们。

还有很多未开发的功能,当然这并不能直接回答您的问题,(SMO),但希望它能让您了解它是可能的,并且其他人已经完成了大部分工作。

你见过 SQLPackage.exe 吗?这会将架构和数据全部打包到一个 zip 文件中。

【讨论】:

    【解决方案4】:

    您可以使用 SQL Server Management Studio 执行此操作。 右键单击数据库实例->任务->生成脚本->然后填充介绍和填充对象(在其中选择您想要数据脚本的表)->现在在设置脚本选项中->单击高级,然后在常规部分->设置要脚本化为仅来自模式的数据的数据类型。您将获得完整的数据脚本作为选定的位置。

    【讨论】:

    • OP 根据他的问题知道这一点 - 他问是否有办法从 API 的角度做到这一点,而不必通过 SSMS 来执行此操作。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多