利用Sql实现将指定表数据导入到另一个数据库示例
因为工作中经常需要将数据从一个数据库导入到另一个数据库中,所以将这个功能写成一个存储过程,以方便调用。现在粘贴出来供大家参考:
注意:
1,以下示例中用到了syscolumns,sysobjects等系统视图,在sql2005及以后的版本中,大家也可以使用sys.columns与sys.objects来代替,只要修改对应的字段即可。
2,以下示例还用到了set identity_insert设置,有对该设置不太清楚的朋友可以点击链接查看其用法。
3,结合sys.tables表与游标,大家可以循环调用以下存储过程以实现将一个数据库中所有的表的数据导入到另一个数据库中。
set QUOTED_IDENTIFIER ON
go
create PROCEDURE [dbo].[Usp_Sys_ImportData] @SourceDBName varchar(128),@TargetDBName varchar(128),@TableName varchar(128) AS
/*
存储过程名称:Usp_Sys_ImportData
功能简述:从来源数据库导入指定表数据到目标数据库
相关对象:
参数:@SourceDBName varchar(128) 来源数据库名称
@TargetDBName varchar(128) 目标数据库名称
@TableName varchar(128) 表名
*/
SET NOCOUNT ON;
declare @TempSql varchar(max)
--取来源表栏位(不包括计算列)
declare @T_SourceColumn Table(ColumnID int not null,ColumnName varchar(128) not null)
select @TempSql = 'select t1.colid,t1.name'
+char(10)+'from ' + @SourceDBName + '..syscolumns t1'
+char(10)+'join ' + @SourceDBName + '..sysobjects t2 on t2.id = t1.id'
+char(10)+'where t2.name = ''' + @TableName + ''''
+char(10)+' and t1.iscomputed = 0'
+char(10)+'order by t1.colid'
insert into @T_SourceColumn(ColumnID,ColumnName)
exec(@TempSql)
--取目标表栏位(不包括计算列)
declare @T_TargetColumn Table(ColumnID int not null,ColumnName varchar(128) not null)
select @TempSql = 'select t1.colid,t1.name'
+char(10)+'from ' + @TargetDBName + '..syscolumns t1'
+char(10)+'join ' + @TargetDBName + '..sysobjects t2 on t2.id = t1.id'
+char(10)+'where t2.name = ''' + @TableName + ''''
+char(10)+' and t1.iscomputed = 0'
+char(10)+'order by t1.colid'
insert into @T_TargetColumn(ColumnID,ColumnName)
exec(@TempSql)
--检查是否有自增列
declare @T_TargetIdentityColumn Table(ColumnID int not null,ColumnName varchar(128) not null)
select @TempSql = 'select t1.colid,t1.name'
+char(10)+'from ' + @TargetDBName + '..syscolumns t1'
+char(10)+'join ' + @TargetDBName + '..sysobjects t2 on t2.id = t1.id'
+char(10)+'where t2.name = ''' + @TableName + ''''
+char(10)+' and t1.colstat = 1'
+char(10)+'order by t1.colid'
insert into @T_TargetIdentityColumn(ColumnID,ColumnName)
exec(@TempSql)
declare @HasIdentityColumn int
if exists(select * from @T_TargetIdentityColumn)
begin
select @HasIdentityColumn = 1
end
else
begin
select @HasIdentityColumn = 0
end
--取要导入的栏位(共同的栏位)
declare @ColumnList varchar(max)
select @ColumnList = ''
select @ColumnList = @ColumnList + ',' + t1.ColumnName
from @T_SourceColumn t1,
@T_TargetColumn t2
where t1.ColumnName = t2.ColumnName
order by t1.ColumnID
if left(@ColumnList,1) = ','
begin
select @ColumnList = substring(@ColumnList,2,len(@ColumnList) - 1)
end
if @ColumnList < > ''
begin
--构造导入数据的SQL
declare @ExecSql varchar(max)
select @ExecSql = 'alter table ' + @TargetDBName + '..' + @TableName + ' disable trigger all'
+ char(10) + 'delete from ' + @TargetDBName + '..' + @TableName
if @HasIdentityColumn = 1
begin
select @ExecSql = @ExecSql + char(10) + 'set identity_insert ' + @TargetDBName + '..' + @TableName + ' on'
end
select @ExecSql = @ExecSql + char(10) + 'insert into ' + @TargetDBName + '..' + @TableName + '(' + @ColumnList + ')'
+ char(10) + 'select ' + @ColumnList + ' from ' + @SourceDBName + '..' + @TableName
if @HasIdentityColumn = 1
begin
select @ExecSql = @ExecSql + char(10) + 'set identity_insert ' + @TargetDBName + '..' + @TableName + ' off'
end
select @ExecSql = @ExecSql + char(10) + 'alter table ' + @TargetDBName + '..' + @TableName + ' enable trigger all'
print @ExecSql
--执行导入
exec(@ExecSql)
if @@error = 0
begin
return 1
end
else
begin
return -1
end
end
else
begin
return 1
end
利用Sql实现将指定表数据导入到另一个数据库示例的更多相关文章
- oracle 两个网络不通的远程数据库如何将一个库中的表数据导入到另一个库中?
1.情景展示 本地可以直接连接2个不同的远程数据库: 两个数据库由于网络不通,无法建立DBLINK完成数据传输: 将A库中C表的数据插入到B库中C表,如何快速实现? 2.解决方案 通过kettle ...
- 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中
oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...
- sql 从一个库中取某个表的数据导入到另一个库中相同结构的表中
sql 2008 从一个库中把 某个表中的数据导入到另一个库中的具有相同结构的表中 use 库1 go insert into 库1.dbo.表1 select * from 库2.dbo.表1 ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- Excel表数据导入Sql Server数据库中
Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nv ...
- SQL SERVER 和ACCESS的数据导入导出
//批量导入Access string filepath = Server.MapPath("student.mdb"); stri ...
- SqlServer一张表数据导入另一张表,收藏使用,工作中更新数据错误很有用
sql一张表数据导入另一张表 1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表; 2.比如要将 arti ...
- 把execel表数据导入mysql数据库
今天,是我来公司第二周的第一天. 作为新入职的实习生,目前还没适合我的实质项目工作,今天的学习任务是: 把execel表数据导入到mysql数据库,再练习下java操作JDBC. 先了解下execel ...
- Bat脚本备份sqlserver 表结构、存储过程、函数、指定表数据
Bat脚本备份sqlserver 表结构.存储过程.指定表数据: @echo off cd /d %~dp0 ::备份表结构.存储过程和部分配置表的数据 set LogFile=report.log ...
随机推荐
- 为了体验 ILS 在Win2012R2 Hyper-V上安装Windows 2000 AdvSer
Win2012 R2 Hyper-V 的集成服务包已不支持Windows 2000 先安装SP4.IE6.更新汇总包,再来安装这个. 安装完成后,会有几个未知设备,直接禁用就可以了. 开启Window ...
- R语言-基本图形
barplot() 条形图 spine() 棘状图 pie() 饼图 hist() 直方图 plot(density(x))核密度图 boxplot(X) 箱线图 vioplot() 小提琴图 dot ...
- 51nod 1237 最大公约数之和 V3
求∑1<=i<=n∑1<=j<=ngcd(i,j) % P P = 10^9 + 7 2 <= n <= 10^10 这道题,明显就是杜教筛 推一下公式: 利用∑d ...
- Elasticsearch初探
elasticsearch中的概念同传统数据库的类比如下: Relational DB -> Databases -> Tables -> Rows -> ColumnsEl ...
- 用Spring+Junit4.4进行测试(使用注解)
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- SQL Server 维护计划实现数据库备份(Step by Step)(转)
SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server ...
- 【OpenCV】视频取坐标
今天实现了视频播放以后暂停获取鼠标点击处坐标的功能. #include <iostream> #include <opencv2/highgui/highgui.hpp> #i ...
- jQuery MiniUI开发系列之:数据验证
在开发应用系统界面时,往往需要进行很多.复杂的数据验证,当填写的数据符合规定,才能提交保存. jQuery MiniUI提供了比较完美的表单数据验证和错误显示的方式. 常见的表单控件,都有一个验证事件 ...
- JNI中C调用Java方法
背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...
- 转:C# 中 MSCHART 饼状图显示百分比
转自:http://blog.sina.com.cn/s/blog_51beaf0e0100yffo.html 1)显示百分比 Chart1.Series["Series1"].L ...