SQL Server 动态生成数据库所有表Insert语句

一、 背景

  SQL Server,如果我们需要把数据库A的所有表数据到数据库B中,通常我们会怎么做呢?我会使用SSMS的导入导出功能,进行表数据的导入导出,无可厚非,这样的导入非常简单和方便;

  但是,当我们的表有上百个,而且有些表是有自增ID的,那么这个时候使用SSMS的话,你需要一个个手动设置(如图1),你要知道,需要设置上百个的这些选项是件多么痛苦的事情,而且最后很可能会因为外键约束导致导入导出失败。

  (图1)

  虽然SSMS在导入导出的最后一步提供了生成SSIS包的功能,但是对于转移数据的需求来说,还是无法达到我想要的快速、方便。

  自然而然,我想到了INSERT INTO XX SELECT FROM XX WHERE这样的方式(这种方式的好处就是可以对数据记录、字段进行控制),但是如何才能快速生成整个数据库所有表的这些语句呢?

  假如你需要批量生成下面的SQL,我想这篇文章就可以帮到你了:

  --[OpinionList]

  SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] ON

  INSERT INTO [master_new].[dbo].[OpinionList](Id,Batch,LinkId,DB_Names,CreateTime)

  SELECT * FROM [DBA_DB].[dbo].[OpinionList]

  SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] OFF

  GO

  二、 脚本解释

  (一) 我编写了一个模板,这个模板你只需要设置@fromdb和@todb的名称,这样就会生成从@fromdb导出所有表插入到@todb中的SQL语句,需要注意的是:要选择@fromdb对应的数


据库执行模板SQL,不然无法生成需要的表和字段。

DECLARE @fromdb VARCHAR(100)

DECLARE @todb VARCHAR(100)

DECLARE @tablename VARCHAR(100)

DECLARE @columnnames NVARCHAR(300)

DECLARE @isidentity NVARCHAR(30)

DECLARE @temsql NVARCHAR(max)

DECLARE @sql NVARCHAR(max)

SET @fromdb = 'master'

SET @todb = 'master_new'

--游标

DECLARE @itemCur CURSOR

SET @itemCur = CURSOR FOR

SELECT '['+[name]+']' from sys.tables WHERE type='U' order by name

OPEN @itemCur

FETCH NEXT FROM @itemCur INTO @tablename

WHILE @@FETCH_STATUS=0

BEGIN

SET @sql = ''


--获取表字段

SET @temsql = N'

BEGIN

SET @columnnamesOUT =''''

SELECT @columnnamesOUT = @columnnamesOUT + '','' + name

From sys.columns where object_id=OBJECT_ID(''['+@fromdb+'].dbo.'+@tablename+''')

order by column_id

SELECT @columnnamesOUT=substring(@columnnamesOUT,2,len(@columnnamesOUT))

END

'

EXEC sp_executesql @temsql,N'@columnnamesOUT NVARCHAR(300) OUTPUT',@columnnamesOUT=@columnnames OUTPUT

PRINT ('--'+@tablename)

--判断是否有自增字段

SET @temsql = N'

BEGIN

SET @isidentityOUT =''''

SELECT @isidentityOUT = name

From sys.columns where object_id=OBJECT_ID(''['+@fromdb+'].dbo.'+@tablename+''')

and is_identity = 1

END

'

EXEC sp_executesql @temsql,N'@isidentityOUT NVARCHAR(30) OUTPUT',@isidentityOUT=@isidentity OUTPUT

--IDENTITY_INSERT ON

IF @isidentity != ''

BEGIN

SET @sql = 'SET IDENTITY_INSERT ['+@todb+'].[dbo].['+@tablename+'] ON

'

END

--INSERT

SET @sql = @sql+'INSERT INTO ['+@todb+'].[dbo].['+@tablename+']('+@columnnames+')

SELECT * FROM ['+@fromdb+'].[dbo].['+@tablename+']'

--IDENTITY_INSERT OFF

IF @isidentity != ''

BEGIN

SET @sql = @sql+'

SET IDENTITY_INSERT ['+@todb+'].[dbo].['+@tablename+'] OFF'

END

--返回SQL

PRINT(@sql)PRINT('GO')+CHAR(13)

FETCH NEXT FROM @itemCur INTO @tablename

END

CLOSE @itemCur

DEALLOCATE @itemCur

  (二) 下面就是返回的生成的部分脚本,模板会自动判断表是否存在自增字段,如果存在就会生成对应的IDENTITY_INSERT语句。


--spt_values

INSERT INTO [master_new].[dbo].[spt_values](name,number,type,low,high,status)

SELECT * FROM [master].[dbo].[spt_values]

GO

--[OpinionList]

SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] ON

INSERT INTO [master_new].[dbo].[OpinionList](Id,Batch,LinkId,DB_Names,CreateTime)

SELECT * FROM [DBA_DB].[dbo].[OpinionList]

SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] OFF

GO

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-14 10:35:55

SQL Server 动态生成数据库所有表Insert语句的相关文章

PowerDesigner 16.5对SQL Server 2012 生成数据库时"不支持扩展属性"问题

原文:PowerDesigner 16.5对SQL Server 2012 生成数据库时"不支持扩展属性"问题 团队合作设计一套系统数据模型,创建了PDM后,Table.View.Store Procedure等都创建好了,且创建了多个Schema方便管理这些数据库对象,但Table.view.Column等对象有Comment时(用来在团队不同成员间共享描述信息) 生成数据库时会得到一个提示"不支持扩展属性,或对象不存在",分析发现异常在类似以下语句: if ex

SQL Server 动态生成分区脚本

一.前言 前段时间使用表分区比较多,虽然已经写了SQL Server 合并(删除)分区解惑.SQL Server 2005 分区模板与实例,但是在实践中一直感觉修改SQL脚本的时间比较多,一直想抽个时间来把分区脚本进行动态化,今天终于付之于行动了.需要说明的一点,下面的脚本并不能满足所有情况,用户可以根据自己的需要进行相应的调整,应该可以满足你的需求的. 在SQL Server 2005中只能通过SQL脚本来创建表分区,而在SQL Server 2008的SSMS中已经提供了操作界面进行表分区,

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)

原文:SQL Server 动态行转列(参数化表名.分组列.行转列字段.字段值) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值: 扩展阅读二:在前面的基础上加入条件过滤: 参考文献(R

SQL Server 2005 查看数据库表的大小 按照表大小排列

(1)Question:尼玛一个数据库,动辄几十个G,伤不起啊,怎样才能知道当前数据库里面各个表的大小呢?以便将部分较大的数据库表中不容易被频繁访问的数据归档到历史表中,例如每天将一个自然年以前的数据放入历史表中.(2)Key:网上搜了一圈,关键字sp_spaceused (参见:http://msdn.microsoft.com/zh-cn/library/ms188776.aspx)(3)Sample:同时找到了一个示例(参见:http://www.linuxso.com/linuxxito

双十一数据库也疯狂,SQL Server 无法生成 FRunCM 线程,求解

  双十一抢购才开始,数据库就出问题了! 一身冷汗,注意不是哪个电商的数据库出问题了,是一个客户公司的数据库出问题了!客户公司是一个原材料生成企业,工厂昼夜不停的生产,核心表数据已有千万之多!可是双十一和它根本就没有任何关系,凌晨两点多数据库就挂了,导致工厂车间所有无法生产!   (一) 问题描述 数据库突然在凌晨两点多就停止了服务,然后就不能重启了!每次去启动之后又自动停止服务了 打开日志查看: SQL Server无法生成FRunCM线程,请查看SQL Server日志和Windows日志

数据库是sql server,现有两张表,用lambda表达式做一个查询

问题描述 数据库是sql server,现有两张表,用lambda表达式做一个查询 表t1有7个字段,包括id,code:表t2有5个字段,包括id: 现在要查询:t2上id与t1上的id相同且code为3的t1上的所有字段. 解决方案 var query = from x in t1 join y in t2 on x.id equals y.id where x.code == 3 select new { x, y };

SQL Server 2005:向系统表说再见

微软的SQL Server 数据库管理员 ,快快想一下!在不使用任何的文档的情况下,编写一个查询,从SQL Server 2000系统表中抽取索引的列表,然后列举每个索引中的字段,并判断这个字段是否按照升序或者降序进行排序.你有两分钟的时间.快!  如果你现在真的停下阅读,开始用必不可少的两分钟时间思考这项不讨好的任务,那么现在你就陷入了一个大麻烦中,这里面涉及了系统索引.系统索引关键字,系统字段,以及一些元数据函数,其中包括类似OBJECT_NAME 和INDEXKEY_PROPERTY这样的

SQL Server 7.0数据库的六种数据移动方法

server|数据|数据库 SQL Server 7.0数据库的六种数据移动方法转自:世纪易网 2003年3月3日20:6本人从事的工作是数据库管理员,要维护多台服务器中的数据库,经常把某台服务器中的某个数据库移动到另外一台服务器,对数据的移动有些心得体会,希望和大家共同交流. 1. 通过工具DTS的设计器进行导入或导出 DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的

《SQL Server企业级平台管理实践》读书笔记——SQL Server中收缩数据库不好用的原因

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server中收缩数据库不好用的原因 数据库管理员有时候需要控制文件的大小,可能选择收缩文件,或者把某些数据文件情况以便从数据库里删除. 这时候我们就要使用到DBCC SHRINKFILE命令,此命令的脚本为: DBCC SHRINKFILE ( { file_name | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATE