情况是这样的:有一个网站开发的时候数据库采用的是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文件去,记得粘贴的是选择文本方式,否则出错,看图:
记得:选择文本方式,我的图没标出
接下来清除只剩下列名。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了
今天就说到这,下次总结下,跨服务的查询的其他语句。