在SQL Server中导出数据为INSERT INTO

我正在使用SQL Server 2008 Management Studio,并有一个表,我想迁移到不同的db服务器。

有任何选项导出数据作为插入到SQL脚本??

480481 次浏览

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

这将允许您为单个或所有表生成脚本,其中一个选项是“脚本数据”。如果您将其设置为TRUE,向导将为您的数据生成一个带有INSERT INTO()语句的脚本。

如果使用2008 R2或2012,它被称为其他东西,请参阅下面的截图

alt text

2008 R2或更高版本,例如2012

选择“脚本的数据类型”,可以是“仅数据”,“模式和数据”或“仅模式”-默认值)。

enter image description here

然后在Codeplex(包括源代码)上有一个“地对地导弹外接程序”包,它承诺几乎相同的功能和更多的功能(如快速查找等)。

alt text

如果你正在运行SQL Server 2008 R2,在SSMS中内置的选项就像上面描述的marc_s一样发生了一些变化。而不是像他的图中那样选择Script data = true,现在在“表/视图选项”分组上方有一个名为"Types of data to script"的新选项。在这里,您可以选择只脚本数据、模式和数据或模式。效果非常好。

你也可以查看SQL Server Management Studio 2008的“Data Scripter插件”:

http://www.mssql-vehicle-data.com/SSMS


它们的特点如下:

  • 它是在SSMS 2008上开发的,目前不支持2005版本(很快!)

  • 快速导出数据到T-SQL的MSSQL和MySQL语法

  • CSV, TXT, XML也支持!充分利用SQL所提供的全部潜力、能力和速度。

  • 不要等待Access或Excel为您执行脚本工作,这可能需要几分钟的时间——让SQL Server为您执行,并将所有的猜测工作从导出数据中排除!

  • 为快速备份、DDL操作等自定义数据输出…

  • 根据需要快速有效地更改表名和数据库模式

  • 导出列名或只生成不带列名的数据。

  • 您可以选择单独的列来编写脚本。

  • 您可以选择数据的子集(WHERE子句)。

  • 您可以选择数据排序(ORDER BY子句)。

  • 伟大的备份实用程序,为那些需要数据操作的肮脏的数据库调试操作。试验时不要丢失数据。在飞行中操纵数据!

为了过于明确的无脑,在遵循Marc_s到这里的指示之后…

在对象资源管理器的SSMS中,右键单击数据库

.单击右键选择“Tasks”,然后选择“Generate Scripts”

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

设置脚本选项步骤上,你必须点击“高级”来获得带有选项的页面。然后,正如Ghlouw所提到的,你现在选择“Types of data to script”和利润。

高级按钮高亮红色!1!!

如果使用SQLServer 2008R2,则需要将“Types of data”设置为“script”字段。

enter image description here

以上都很好,但如果你需要

  1. 使用连接从多个视图和表导出数据
  2. 为不同的rdbms创建插入语句
  3. 将数据从任意RDBMS迁移到任意RDBMS

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

首先学习如何从源db命令行客户端创建spool文件或导出结果集。 第二,学习如何在目标db上执行sql语句 最后,通过在源数据库上运行sql脚本,为目标数据库创建插入语句(以及任何其他语句)。 例如< / p >

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的db创建的,其中需要使用dual进行无表选择。

结果集将包含目标db的脚本。

下面是一个使用游标迭代源表创建数据迁移脚本的示例。

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'

对于那些寻找命令行版本的人,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 cmdlet来实现这一点:

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

在搜索了很多之后,这是我最好的选择:

如果你有大量的数据,需要一个紧凑而优雅的脚本,试试SSMS工具包

它生成一个所有选择语句的联合,将项目插入到目标表中,并很好地处理事务。

截图 .

SQl server Mng Studio 2016:

enter image description here