急急急!!!跪求SQL2005不同数据库之间复制表数据方法

时间:2021-11-20 20:47:47
数据库数据复制 
将一个数据库中的数据复制到另一个数据库 
如果某列在目标数据库中为标识列,将不会被复制 
要求适用范围:数据库结构发生了变化,想将旧数据库进行升级 
可以根据新的数据库结构创建一个空库,然后 
将旧数据库的所有数据复制到新库中

希望提供好的实例!!!感激不尽

18 个解决方案

#1


备份,ftp bak文件到另外个服务器上还原

#2


仅仅是1个表的数据的或可以保存为csv文件或者excel,通过ftp传过去,然后在服务器上导入
根据导入导出向导自己选下就可以了

#3


自增列可以空一列即可,会自动生成。

#4


150多个表,且字段方面多少有点改动。

#5


这个我也想知道  ! 一起等答案吧  帮你顶顶!

#6


字段有改动就没办法了 只能一张一张的

insert into b..tb(col1,col2) select col1,col2.. from a..ta

#7


如果是远程的话:
参考:

/*不同服务器数据库之间的数据操作*/

--创建链接服务器 
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 ' 

--查询示例 
select * from ITSV.数据库名.dbo.表名 

--导入示例 
select * into 表 from ITSV.数据库名.dbo.表名 

--以后不再使用时删除链接服务器 
exec sp_dropserver  'ITSV ', 'droplogins ' 

--连接远程/局域网数据(openrowset/openquery/opendatasource) 
--1、openrowset 

--查询示例 
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

--生成本地表 
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

--把本地表导入远程表 
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 
select *from 本地表 

--更新本地表 
update b 
set b.列A=a.列A 
 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b 
on a.column1=b.column1 

--openquery用法需要创建一个连接 

--首先创建一个连接创建链接服务器 
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
--查询 
select * 
FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
--把本地表导入远程表 
insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
select * from 本地表 
--更新本地表 
update b 
set b.列B=a.列B 
FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a  
inner join 本地表 b on a.列A=b.列A 

--3、opendatasource/openrowset 
SELECT   * 
FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 
--把本地表导入远程表 

#8


用导入导出向导做,在导出时,编辑列映射那一页上有一个"启用标识插入"选项,把它选中就行了.

#9


数据库导入导出功能可实现

#10



--表复制
IF exists (select * from sysobjects where id = object_id(N'[CopyTable]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
DROP PROCEDURE CopyTable
GO
Create Procedure CopyTable
(@DestDBName NVARCHAR(30) , 
@SourceDBName nVARCHAR(30),
@tblName VARCHAR(30))
AS
SET NOCOUNT  ON
if (select object_id('Tempdb..#tblMSG')) IS NOT Null
  DROP TABLE #tblMSG
EXEC DisableDMLTriger @tblName
if  exists (select * from sysobjects where id = object_id(@tblName) and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
BEGIN
--生成临时表 (存储列ID,列名,列类型)
SELECT 
Column_ID=IDENTITY(INT,1,1),
ColumnName=C.name,
Type=T.name
INTO #tblMsg
FROM sys.columns C
INNER JOIN sys.objects O
ON C.[object_id]=O.[object_id]
AND O.type='U'
AND O.is_ms_shipped=0
INNER JOIN sys.types T
ON C.user_type_id=T.user_type_id
WHERE O.name=@tblName
ORDER BY O.name,C.column_id

--SELECT * FROM #tblmsg

--构造字段(排除属性为timestamp的列)
DECLARE @rowNumber int,@maxNum INT
DECLARE @strSQL_Insert NVARCHAR(4000),@strSql_Delete NVARCHAR(4000),@strSql NVARCHAR(4000)
DECLARE @colType VARCHAR(100),@colName VARCHAR(100)

SET @rowNumber=1

select @maxNum= MAX(column_id) FROM #tblMSG

WHILE @rownumber<=@maxNum
BEGIN
SELECT @colName=columnName,@coltype=[TYPE] FROM #tblMSG WHERE Column_ID=@rowNumber
IF @coltype<>'timestamp'
IF @rowNumber=1 
set @strSql=@ColName
ELSE
set @strSql=@strSql+','+@ColName
SET @rowNumber=@rowNumber+1
END

--删除临时表
DROP TABLE #tblMSG

--构造删除语句
set @strSql_Delete ='Delete from ' +@DestDBName+'..'+ @tblName
--构造复制语句
if EXISTS(SELECT 1 FROM SYSOBJECTS
WHERE ID = OBJECT_ID(@tblName)
AND OBJECTPROPERTY(ID,N'TableHasIdentity') = 1)
BEGIN
set @strSQL_Insert = 'set identity_insert ' + @DestDBName + '.dbo.' + @tblName + ' ON '
set @strSQL_Insert = @strSQL_Insert + 'INSERT INTO '+ @DestDBName+'..'+ @tblName + ' (' + @strSql + ') ' + ' SELECT ' + @strSql +' FROM '+ @SourceDBName+'..'+@tblName
set @strSQL_Insert = @strSQL_Insert + ' set identity_insert ' + @DestDBName + '.dbo.' + @tblName + ' OFF '
END
ELSE
BEGIN
set @strSQL_Insert = 'INSERT INTO '+ @DestDBName+'..'+ @tblName + ' (' + @strSql + ') ' + ' SELECT ' + @strSql +' FROM '+ @SourceDBName+'..'+@tblName
END
--将目标数据库中的 @tblName 表数据删除
EXEC sp_executesql @strSql_Delete 

--将源数据库中的 @tblName 表数据复制到目标数据库的 @tblName 
EXEC sp_executesql @strSQL_Insert

exec EnableDMLTriger @tblName
END
ELSE
PRINT  'The Table ' + @tblName +' you want to copy is not exist.'
GO

注意:
lz可以根据自己的实际情况更改插入语句
比如你的a数据库中的aaa字段在b数据库中若变成bbb,这时你需要自己构造了

#11


上面
EXEC DisableDMLTriger @tblName
exec EnableDMLTriger @tblName
是禁用触发器的,lz可以注掉

#12


导入数据功能吧

#13


不知道。

#14


SQL2005后的数据库复制功能。
会自动同步数据,及表结构变化.

#15


该回复于2011-12-08 09:09:05被版主删除

#16


看看我的需求给帮助答案吧。

数据库数据复制  
将一个数据库中的数据复制到另一个数据库  
如果某列在目标数据库中为标识列,将不会被复制  
要求适用范围:数据库结构发生了变化,想将旧数据库进行升级  
可以根据新的数据库结构创建一个空库,然后  
将旧数据库的所有数据复制到新库中

希望提供好的实例!!!感激不尽

#17


数据库数据复制  
将一个数据库中的数据复制到另一个数据库  
如果某列在目标数据库中为标识列,将不会被复制  
要求适用范围:数据库结构发生了变化,想将旧数据库进行升级  
可以根据新的数据库结构创建一个空库,然后  
将旧数据库的所有数据复制到新库中

希望提供好的实例!!!感激不尽

#18


即使是整个数据库里面的有且仅有的150个用户表需要迁移,系统也并不清楚两个数据库系统之间的表映射关系;即使表名都一直,大部分字段名及格式都一直,可能数据表之间也有关系,迁移也需要分先后顺序迁移;关键是,系统并不知道两个数据库字段差异的部分如何对应吧?设计人员才知道差异吧?
我也很关注这个帖子,看看大师们有什么招儿。
引用 4 楼 flj1024 的回复:
150多个表,且字段方面多少有点改动。

#1


备份,ftp bak文件到另外个服务器上还原

#2


仅仅是1个表的数据的或可以保存为csv文件或者excel,通过ftp传过去,然后在服务器上导入
根据导入导出向导自己选下就可以了

#3


自增列可以空一列即可,会自动生成。

#4


150多个表,且字段方面多少有点改动。

#5


这个我也想知道  ! 一起等答案吧  帮你顶顶!

#6


字段有改动就没办法了 只能一张一张的

insert into b..tb(col1,col2) select col1,col2.. from a..ta

#7


如果是远程的话:
参考:

/*不同服务器数据库之间的数据操作*/

--创建链接服务器 
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 ' 

--查询示例 
select * from ITSV.数据库名.dbo.表名 

--导入示例 
select * into 表 from ITSV.数据库名.dbo.表名 

--以后不再使用时删除链接服务器 
exec sp_dropserver  'ITSV ', 'droplogins ' 

--连接远程/局域网数据(openrowset/openquery/opendatasource) 
--1、openrowset 

--查询示例 
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

--生成本地表 
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

--把本地表导入远程表 
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 
select *from 本地表 

--更新本地表 
update b 
set b.列A=a.列A 
 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b 
on a.column1=b.column1 

--openquery用法需要创建一个连接 

--首先创建一个连接创建链接服务器 
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
--查询 
select * 
FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
--把本地表导入远程表 
insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
select * from 本地表 
--更新本地表 
update b 
set b.列B=a.列B 
FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a  
inner join 本地表 b on a.列A=b.列A 

--3、opendatasource/openrowset 
SELECT   * 
FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 
--把本地表导入远程表 

#8


用导入导出向导做,在导出时,编辑列映射那一页上有一个"启用标识插入"选项,把它选中就行了.

#9


数据库导入导出功能可实现

#10



--表复制
IF exists (select * from sysobjects where id = object_id(N'[CopyTable]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
DROP PROCEDURE CopyTable
GO
Create Procedure CopyTable
(@DestDBName NVARCHAR(30) , 
@SourceDBName nVARCHAR(30),
@tblName VARCHAR(30))
AS
SET NOCOUNT  ON
if (select object_id('Tempdb..#tblMSG')) IS NOT Null
  DROP TABLE #tblMSG
EXEC DisableDMLTriger @tblName
if  exists (select * from sysobjects where id = object_id(@tblName) and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
BEGIN
--生成临时表 (存储列ID,列名,列类型)
SELECT 
Column_ID=IDENTITY(INT,1,1),
ColumnName=C.name,
Type=T.name
INTO #tblMsg
FROM sys.columns C
INNER JOIN sys.objects O
ON C.[object_id]=O.[object_id]
AND O.type='U'
AND O.is_ms_shipped=0
INNER JOIN sys.types T
ON C.user_type_id=T.user_type_id
WHERE O.name=@tblName
ORDER BY O.name,C.column_id

--SELECT * FROM #tblmsg

--构造字段(排除属性为timestamp的列)
DECLARE @rowNumber int,@maxNum INT
DECLARE @strSQL_Insert NVARCHAR(4000),@strSql_Delete NVARCHAR(4000),@strSql NVARCHAR(4000)
DECLARE @colType VARCHAR(100),@colName VARCHAR(100)

SET @rowNumber=1

select @maxNum= MAX(column_id) FROM #tblMSG

WHILE @rownumber<=@maxNum
BEGIN
SELECT @colName=columnName,@coltype=[TYPE] FROM #tblMSG WHERE Column_ID=@rowNumber
IF @coltype<>'timestamp'
IF @rowNumber=1 
set @strSql=@ColName
ELSE
set @strSql=@strSql+','+@ColName
SET @rowNumber=@rowNumber+1
END

--删除临时表
DROP TABLE #tblMSG

--构造删除语句
set @strSql_Delete ='Delete from ' +@DestDBName+'..'+ @tblName
--构造复制语句
if EXISTS(SELECT 1 FROM SYSOBJECTS
WHERE ID = OBJECT_ID(@tblName)
AND OBJECTPROPERTY(ID,N'TableHasIdentity') = 1)
BEGIN
set @strSQL_Insert = 'set identity_insert ' + @DestDBName + '.dbo.' + @tblName + ' ON '
set @strSQL_Insert = @strSQL_Insert + 'INSERT INTO '+ @DestDBName+'..'+ @tblName + ' (' + @strSql + ') ' + ' SELECT ' + @strSql +' FROM '+ @SourceDBName+'..'+@tblName
set @strSQL_Insert = @strSQL_Insert + ' set identity_insert ' + @DestDBName + '.dbo.' + @tblName + ' OFF '
END
ELSE
BEGIN
set @strSQL_Insert = 'INSERT INTO '+ @DestDBName+'..'+ @tblName + ' (' + @strSql + ') ' + ' SELECT ' + @strSql +' FROM '+ @SourceDBName+'..'+@tblName
END
--将目标数据库中的 @tblName 表数据删除
EXEC sp_executesql @strSql_Delete 

--将源数据库中的 @tblName 表数据复制到目标数据库的 @tblName 
EXEC sp_executesql @strSQL_Insert

exec EnableDMLTriger @tblName
END
ELSE
PRINT  'The Table ' + @tblName +' you want to copy is not exist.'
GO

注意:
lz可以根据自己的实际情况更改插入语句
比如你的a数据库中的aaa字段在b数据库中若变成bbb,这时你需要自己构造了

#11


上面
EXEC DisableDMLTriger @tblName
exec EnableDMLTriger @tblName
是禁用触发器的,lz可以注掉

#12


导入数据功能吧

#13


不知道。

#14


SQL2005后的数据库复制功能。
会自动同步数据,及表结构变化.

#15


该回复于2011-12-08 09:09:05被版主删除

#16


看看我的需求给帮助答案吧。

数据库数据复制  
将一个数据库中的数据复制到另一个数据库  
如果某列在目标数据库中为标识列,将不会被复制  
要求适用范围:数据库结构发生了变化,想将旧数据库进行升级  
可以根据新的数据库结构创建一个空库,然后  
将旧数据库的所有数据复制到新库中

希望提供好的实例!!!感激不尽

#17


数据库数据复制  
将一个数据库中的数据复制到另一个数据库  
如果某列在目标数据库中为标识列,将不会被复制  
要求适用范围:数据库结构发生了变化,想将旧数据库进行升级  
可以根据新的数据库结构创建一个空库,然后  
将旧数据库的所有数据复制到新库中

希望提供好的实例!!!感激不尽

#18


即使是整个数据库里面的有且仅有的150个用户表需要迁移,系统也并不清楚两个数据库系统之间的表映射关系;即使表名都一直,大部分字段名及格式都一直,可能数据表之间也有关系,迁移也需要分先后顺序迁移;关键是,系统并不知道两个数据库字段差异的部分如何对应吧?设计人员才知道差异吧?
我也很关注这个帖子,看看大师们有什么招儿。
引用 4 楼 flj1024 的回复:
150多个表,且字段方面多少有点改动。