将数据从SQL Server导出为INSERT INTO语句

491

我正在使用 SQL Server 2008 管理工具,并且有一个表需要迁移到其他数据库服务器。

是否有将数据导出为插入到 SQL 脚本的选项?

11个回答

788
在 SSMS 的对象资源管理器中,右键单击数据库,选择 "任务",然后选择 "生成脚本"。这样可以为单个或所有表生成脚本,其中一个选项是 "脚本数据"。如果将其设置为 TRUE,则向您的数据生成用于 INSERT INTO() 语句的脚本。如果使用 2008 R2 或 2012,则称为其他名称,请参见下面的截图。

alt text

2008 R2或更高版本,例如2012年

选择“要脚本的数据类型”,可以是“仅数据”,“架构和数据”或“仅架构”(默认)。

enter image description here

然后在Codeplex上有一个"SSMS Addin"包(包括源代码),承诺提供几乎相同的功能和更多功能(例如快速查找等)

alt text


1
SMSS插件在2008年对我有效。数据脚本插件则没有。 - Phil Hale
6
在2008 R2版本中,“脚本的数据类型”选项可以在“设置脚本选项”屏幕上找到。 在那里点击“高级”按钮。 - raymi
3
这些插件在2008 R2中能用吗?SSMS插件在加载时抛出异常。 - jocull
2
请查看下面@ruffin的答案,以获取更多截图 - Keith Sirmons
那个添加链接现在跳转到了一个垃圾网站。 - Hippyjim
显示剩余6条评论

148

为了避免过于详细的无脑操作,在按照marc_s的指示到达这里之后...

在SSMS对象资源管理器中,右键单击数据库并选择“任务”,然后选择“生成脚本”。

... 然后我看到一个向导屏幕,上面有“介绍、选择对象、设置脚本选项、摘要和保存或发布脚本”,底部有前一页、下一页、完成、取消按钮。

设置脚本选项步骤中,你需要点击“高级”以获取带有选项的页面。接着,如Ghlouw所提到的,你现在选择“要编写脚本的数据类型”,即可受益。

高亮显示的“高级”按钮!1!


16
谢谢,这个按钮的位置并不是很直观。我原以为它属于“保存到文件”。 - Karel Kral

57
如果您使用 SQLServer 2008R2,您需要将数据类型设置为脚本字段。 输入图像说明

2
也适用于2012年。 - OldCurmudgeon
1
同样适用于2014年。 - NucS
2
如果你和我一样感到困惑,那么“脚本数据类型”选项只会在“生成脚本…”向导的“高级”选项中可见 - 你不会在主选项对话框中找到它! - Etherman

39

我只是为了帮助其他人而更新截图,因为我正在使用较新的v18(2019年左右)。

右键单击DB:任务 > 生成脚本

您可以在此选择某些表,也可以选择所有默认值。

您可以在此选择某些表,也可以选择所有默认值。对于我的需要,我只标示一个表。

接下来是“脚本选项”,您可以选择输出文件等。就像多个答案中所述(再次强调,我只是为了新的v18.4 SQL Server Management Studio而清理旧答案),我们真正想要的是在“高级”按钮下面。出于我的目的,我仅需要数据。

包括输出到文件在内的通用输出选项。 包括数据在内的高级选项!

最后,在执行之前有一个审核摘要。执行后会显示操作状态的报告。 审核摘要。


37
如果你正在运行 SQL Server 2008 R2,像 marc_s 上面描述的那样在 SSMS 中执行此操作的内置选项已经有所改变。不要像他的图表中所示选择 "Script data = true",而是现在有一个名为 "Types of data to script" 的新选项,就在 "Table/View Options" 分组上方。在这里,您可以选择仅脚本数据、模式和数据或仅模式。非常好用。

11

对于那些寻找命令行版本的人,Microsoft发布了 mssql-scripter 来完成这个任务。

$ pip install mssql-scripter

# Generate DDL scripts for all database objects and DML scripts (INSERT statements)
# for all tables in the Adventureworks database and save the script files in
# the current directory
$ mssql-scripter -S localhost -d AdventureWorks -U sa --schema-and-data \
                 -f './' --file-per-object

dbatools.io 是一个基于 PowerShell 的活跃度更高的项目,它提供了 Get-DbaDbTableExport-DbaDbTableData 命令来实现此功能:

PS C:\> Get-DbaDbTable -SqlInstance sql2016 -Database MyDatabase \
           -Table 'dbo.Table1', 'dbo.Table2' | 
        Export-DbaDbTableData -Path C:\temp\export.sql

看起来mssql-scripter现在是一个已经停止维护的项目了。 - Alex Suzuki
真的,在过去的一年里没有进行任何开发,但对我来说它运行良好。 - Nickolay

10

针对SQL Server Mng Studio 2016:

在此输入图片描述


这是一个来自SQL Server 2016版本及以后的精确示例。 - yuvraj

2
您也可以查看 SQL Server Management Studio 2008 的“Data Scripter Add-In”。该工具的下载链接为:http://www.mssql-vehicle-data.com/SSMS
以下是该工具的功能列表:
- 它是基于 SSMS 2008 开发的,目前不支持 2005 版本(但很快会支持)。 - 快速将数据导出到 MSSQL 和 MySQL 语法的 T-SQL 中。 - 同时支持 CSV、TXT 和 XML 格式。充分利用 SQL 所提供的全部潜力、能力和速度。 - 不要等待 Access 或 Excel 完成需要花费几分钟才能完成的脚本工作——让 SQL Server 为您完成这些工作,并消除所有猜测性,以便轻松导出数据! - 可自定义数据输出,以进行快速备份、DDL 操作等。 - 快速高效地更改表名和数据库模式以满足您的需求。 - 导出列名称或仅生成不带名称的数据。 - 可选择单个列进行脚本处理。 - 可选择数据子集(WHERE 子句)。 - 可选择数据排序方式(ORDER BY 子句)。 - 对于那些需要数据操作的脏数据调试操作,它是一个非常好的备份实用程序。在实验过程中不要丢失数据。在进行数据操作的同时对其进行操纵!

2

以上内容很好,但如果您需要:

  1. 从多个视图和表连接中导出数据
  2. 为不同的关系型数据库创建插入语句
  3. 将数据从任何一个关系型数据库迁移到另一个关系型数据库

那么以下技巧是唯一的方法。

首先学习如何从源数据库命令行客户端创建 spool 文件或导出结果集。 其次学习如何在目标数据库上执行 SQL 语句。

最后,在源数据库上运行 SQL 脚本来创建目标数据库的插入语句(以及任何其他语句)。 例如:

SELECT '-- SET the correct schema' FROM dual;
SELECT 'USE test;' FROM dual;
SELECT '-- DROP TABLE IF EXISTS' FROM dual;
SELECT 'IF OBJECT_ID(''table3'', ''U'') IS NOT NULL DROP TABLE dbo.table3;' FROM dual;
SELECT '-- create the table' FROM dual;
SELECT 'CREATE TABLE table3 (column1 VARCHAR(10), column2 VARCHAR(10));' FROM dual;

SELECT 'INSERT INTO table3 (column1, column2) VALUES (''', table1.column1, ''',''', table2.column2, ''');' FROM table1 JOIN table2 ON table2.COLUMN1 = table1.COLUMN1;

上面的示例是为 Oracle 数据库创建的,其中使用 dual 用于无表选择。
结果集将包含目标数据库的脚本。

1
这是一个使用游标迭代源表创建数据迁移脚本的示例。
SET NOCOUNT ON;  
DECLARE @out nvarchar(max) = ''
DECLARE @row nvarchar(1024)
DECLARE @first int = 1

DECLARE cur CURSOR FOR 
    SELECT '(' + CONVERT(CHAR(1),[Stage]) + ',''' + [Label] + ''')'
    FROM CV_ORDER_STATUS
    ORDER BY [Stage]

PRINT 'SET IDENTITY_INSERT dbo.CV_ORDER_STATUS ON'
PRINT 'GO'

PRINT 'INSERT INTO dbo.CV_ORDER_STATUS ([Stage],[Label]) VALUES';

OPEN cur
FETCH NEXT FROM cur
    INTO @row

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @first = 1
        SET @first = 0
    ELSE
        SET @out = @out + ',' + CHAR(13);

    SET @out = @out + @row

    FETCH NEXT FROM cur into @row
END

CLOSE cur
DEALLOCATE cur

PRINT @out

PRINT 'SET IDENTITY_INSERT dbo.CV_ORDER_STATUS OFF'
PRINT 'GO'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接