因为工作中经常需要将数据从一个数据库导入到另一个数据库中,所以将这个功能写成一个存储过程,以方便调用。现在粘贴出来供大家参考:

注意:
1,以下示例中用到了syscolumns,sysobjects等系统视图,在sql2005及以后的版本中,大家也可以使用sys.columns与sys.objects来代替,只要修改对应的字段即可。
2,以下示例还用到了set identity_insert设置,有对该设置不太清楚的朋友可以点击链接查看其用法。
3,结合sys.tables表与游标,大家可以循环调用以下存储过程以实现将一个数据库中所有的表的数据导入到另一个数据库中。

set ANSI_NULLS ON
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

http://www.lmwlove.com/ac/ID807

利用Sql实现将指定表数据导入到另一个数据库示例的更多相关文章

  1. oracle 两个网络不通的远程数据库如何将一个库中的表数据导入到另一个库中?

      1.情景展示 本地可以直接连接2个不同的远程数据库: 两个数据库由于网络不通,无法建立DBLINK完成数据传输: 将A库中C表的数据插入到B库中C表,如何快速实现? 2.解决方案 通过kettle ...

  2. 两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中

    oracle数据库实现一张表的数据导入到另外一个数据库的表中的方法有很多,在这介绍两个. 第一种,把oracle查询的数据导出为sql文件,执行sql文件里的insert语句,如下: 第一步,导出sq ...

  3. sql 从一个库中取某个表的数据导入到另一个库中相同结构的表中

    sql 2008 从一个库中把 某个表中的数据导入到另一个库中的具有相同结构的表中 use 库1 go insert into  库1.dbo.表1  select * from  库2.dbo.表1 ...

  4. C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库

    C# DateTime的11种构造函数   别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...

  5. Excel表数据导入Sql Server数据库中

    Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nv ...

  6. SQL SERVER 和ACCESS的数据导入导出

            //批量导入Access         string filepath = Server.MapPath("student.mdb");         stri ...

  7. SqlServer一张表数据导入另一张表,收藏使用,工作中更新数据错误很有用

    sql一张表数据导入另一张表   1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法:   INSERT INTO 目标表 SELECT * FROM 来源表;   2.比如要将 arti ...

  8. 把execel表数据导入mysql数据库

    今天,是我来公司第二周的第一天. 作为新入职的实习生,目前还没适合我的实质项目工作,今天的学习任务是: 把execel表数据导入到mysql数据库,再练习下java操作JDBC. 先了解下execel ...

  9. Bat脚本备份sqlserver 表结构、存储过程、函数、指定表数据

    Bat脚本备份sqlserver 表结构.存储过程.指定表数据: @echo off cd /d %~dp0 ::备份表结构.存储过程和部分配置表的数据 set LogFile=report.log ...

随机推荐

  1. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  2. Nuke

    - Debugging python code IN nuke with Eclipse - Documents: http://www.thefoundry.co.uk/products/nuke- ...

  3. 黄聪:C#中HtmlAgilityPack判断是否包含或不包含指定的属性或值

    //选择不包含class属性的节点 var result = node.SelectNodes(".//span[not(@class)]"); //选择不包含class和id属性 ...

  4. java 用插入排序思想,对不规则数组排序。

    知道插入排序后,无意中发现,用插入排序思想,对不规则数组排序的排序 发现和许多大神写的不一样,大神写的简洁多了.--------

  5. deep learning 练习 多变量线性回归

    多变量线性回归(Multivariate Linear Regression) 作业来自链接:http://openclassroom.stanford.edu/MainFolder/Document ...

  6. 从jQuery源码阅读看 dom load

    最近两天不忙的时候再回过来研究一下jquery的源码,看到$(document).ready()时,深入的研究了一下dom的加载问题. 我们都知道,window.onload可以解决我们的js执行时机 ...

  7. 在vs2012中使用TeeChart空间

      今天下了TeeChart  安装中发现没有VS2012选项 在看了官网回答后  可以 如下解决 1.- Install last maintenance release of 28 Septemb ...

  8. 深入理解Oracle的并行操作-转载

    转载:http://czmmiao.iteye.com/blog/1487568 并行(Parallel)和OLAP系统 并行的实现机制是:首先,Oracle会创建一个进程用于协调并行服务进程之间的信 ...

  9. 单片机联网需求攀升 WIZnet全硬件TCP/IP技术崛起

    --新华龙电子为韩国WIZnet公司网络芯片授权代理商,具有20多年的专业团队IC应用开发实力-- 如今不管是在企业还是小区.街道,甚至是居民室内,以太网接口无处不在.有鉴于此,电子设备必将向更加智能 ...

  10. oracle并发请求异常,运行时间超长(一般情况下锁表)

    1.如果前台无法取消请求出现错误: 则后台更新 update fnd_concurrent_requests    set status_code = 'X', phase_code = 'C'  w ...