脚本表与代码中的数据

时间:2013-06-24 17:42:52

标签: c# sql-server ssms smo

在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的人来说非常方便。再次感谢所有回答的人。

4 个答案:

答案 0 :(得分:3)

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

来自MSDN:

  

SQL Server管理对象(SMO)是为其设计的对象   Microsoft SQL Server的程序化管理。您可以使用SMO   构建自定义的SQL Server管理应用程序。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

脚本化模式的功能不在sql库中,而是在visual studio库中。

E.g。 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文件。

答案 3 :(得分:0)

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