情况是这样的:有一个网站开发的时候数据库采用的是sql2005 因为有这个要发布的网站所在的服务器没有sql2005,只有sql2000,本可以把数据库放到一台装有sql2005的,然后远程连接,但是以后不便于维护。

sql2005的这个数据库和sql2000的对应的数据库结构都一样,但我只需要复制sql2005特定的一个表到sql2000去(不是简单的sql2005转sql2000,只是一个表)。

 

开始我并没想到可以跨服务器(在我这台电脑算是跨实例吧)。于是我采用的第一种方式是先把sql2005导出到excel然后导入到sql2000.稍后贴出第二种方法。

方法一:

  第一步:在桌面上建立一个excel文件,命名为table.xls,这个文件里面不能为空,需要填上列名,因为要复制的这个表的列名我自己都不知道有多少列,本想查询列的数量,然后1,2,3直到列的数量相同。遗憾的是我还没找出这个语句。所以看第二步吧。

  第二步:查询语句:select top 1 * from 表名 记得显示的结果选为文本,以便复制到table.xls里面去。ok,复制好了,然后粘贴到xls文件去,记得粘贴的是选择文本方式,否则出错,看图:

sql server跨服务器连接 sql跨服务器复制表_sql

记得:选择文本方式,我的图没标出

接下来清除只剩下列名。ok


第三步:执行sql语句:

insert   into    
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'    
,'Excel 5.0;HDR=YES;DATABASE=C:\Documents and Settings\Administrator\Desktop\table.xls', [sheet1$])     
select * from nt_news_class

ok 了。接下来导入。这里不说了,有兴趣看看我的另一篇《sql导入excel实验》;

 

方法二:

执行 在sql2000中

insert into  表名1(sql2000的)
select * from openrowset( 'SQLOLEDB', '.\sql2005(服务器名远程或者实例名)'; 'sa(账户)'; '123456(密码)',数据库.dbo.表名)

这样执行肯定是不行的,为啥,因为有个列是自动增长的,那怎么办了,网上看了一句话 变成:

set IDENTITY_INSERT  nt_news_class ON

insert into  表名1(sql2000的)
select * from openrowset( 'SQLOLEDB', '.\sql2005(服务器名远程或者实例名)'; 'sa(账户)'; '123456(密码)',数据库.dbo.表名)

这样还是不行的,因为提示已经说的很清楚了,必须使用了自增长列名,且设为on,因为上句话没有出现自增长的列名

如果这样,应该能行的:

set IDENTITY_INSERT  nt_news_class ON

insert into  表名1(自增长列,col1,col2.。。。)(sql2000的)
select * from openrowset( 'SQLOLEDB', '.\sql2005(服务器名远程或者实例名)'; 'sa(账户)'; '123456(密码)',数据库.dbo.表名)

所以已经自增长列必须出现。

但我懒的去写,因为太多了,所以我经过测试后,先把sql2000的这个表自增长的列改为不增长,然后插入,ok,接着改回来。ok。

一切ok了

 

今天就说到这,下次总结下,跨服务的查询的其他语句。