新聞中心
在日常開(kāi)發(fā)中,我們常常需要將一個(gè)數(shù)據(jù)庫(kù)中的表數(shù)據(jù)復(fù)制到另一個(gè)數(shù)據(jù)庫(kù)中,以達(dá)到數(shù)據(jù)同步或者備份的目的。在同一個(gè)數(shù)據(jù)庫(kù)中,很容易實(shí)現(xiàn)這個(gè)功能,直接使用 INSERT INTO SELECT 或者 SELECT INTO 語(yǔ)句就可以了。但是如果要跨越不同的數(shù)據(jù)庫(kù),就需要使用不同的方法。本文就介紹一下如何使用SQL來(lái)實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)復(fù)制表數(shù)據(jù)的功能。

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、東勝ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的東勝網(wǎng)站制作公司
一、使用Linked Server
Linked Server 是SQL Server 提供的一個(gè)功能,它可以在一個(gè)本地 SQL Server 中定義一個(gè)對(duì)另一個(gè)遠(yuǎn)程 SQL Server 的引用。通過(guò)這個(gè)功能,我們可以在一個(gè)數(shù)據(jù)庫(kù)中直接訪問(wèn)另一個(gè)數(shù)據(jù)庫(kù)中的表和數(shù)據(jù)。以下是一個(gè)示例代碼:
–創(chuàng)建一個(gè)遠(yuǎn)程服務(wù)器,引用另一個(gè)數(shù)據(jù)庫(kù)
EXEC sp_addlinkedserver
@server = ‘RemoteServer’,
@srvproduct = ”,
@provider = ‘SQLOLEDB’,
@datasrc = ‘RemoteServer\InstanceName’
–配置登錄賬戶信息
EXEC sp_addlinkedsrvlogin
@rmtsrvname = ‘RemoteServer’,
@useself = ‘False’,
@rmtuser = ‘RemoteUser’,
@rmtpassword = ‘RemotePassword’
–查詢遠(yuǎn)程服務(wù)器中的表
SELECT * FROM [RemoteServer].[RemoteDatabaseName].[dbo].[RemoteTableName]
通過(guò)以上代碼,我們就可以在本地服務(wù)器中訪問(wèn)遠(yuǎn)程服務(wù)器中的表數(shù)據(jù),然后使用 INSERT INTO SELECT 語(yǔ)句來(lái)將數(shù)據(jù)復(fù)制到本地?cái)?shù)據(jù)庫(kù)中。
二、使用OPENROWSET 和 OPENDATASOURCE
除了使用Linked Server,我們還可以通過(guò)OPENROWSET 和 OPENDATASOURCE 這兩個(gè)SQL Server提供的函數(shù)來(lái)連接不同的數(shù)據(jù)庫(kù),實(shí)現(xiàn)數(shù)據(jù)復(fù)制的功能。以下是一個(gè)示例代碼:
–使用OpenDataSource函數(shù)連接遠(yuǎn)程服務(wù)器
SELECT *
FROM OPENDATASOURCE(‘SQLOLEDB’, ‘Data Source=RemoteServer\InstanceName;User ID=RemoteUser;Password=RemotePassword;’).[RemoteDatabaseName].[dbo].[RemoteTableName]
–使用OpenRowSet函數(shù)連接遠(yuǎn)程服務(wù)器
SELECT *
FROM OPENROWSET(‘SQLOLEDB’, ‘Data Source=RemoteServer\InstanceName;User ID=RemoteUser;Password=RemotePassword;’,
‘SELECT * FROM [RemoteDatabaseName].[dbo].[RemoteTableName]’)
以上代碼中,我們使用不同的函數(shù),使用相同的方式連接了遠(yuǎn)程服務(wù)器,并查詢了遠(yuǎn)程服務(wù)器中的表數(shù)據(jù),然后使用 INSERT INTO SELECT 語(yǔ)句將數(shù)據(jù)復(fù)制到本地?cái)?shù)據(jù)庫(kù)中。
三、使用SQL Server數(shù)據(jù)工具包
我們還可以使用SQL Server 數(shù)據(jù)工具包導(dǎo)入和導(dǎo)出數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)復(fù)制的功能。以下是一個(gè)示例代碼:
–使用SQL Server 數(shù)據(jù)工具包導(dǎo)出數(shù)據(jù)
bcp “SELECT * FROM [RemoteServer].[RemoteDatabaseName].[dbo].[RemoteTableName]” queryout “c:\temp\output.txt” -c -T
–使用SQL Server 數(shù)據(jù)工具包導(dǎo)入數(shù)據(jù)
bcp [LocalDatabaseName].[dbo].[LocalTableName] in “c:\temp\output.txt” -c -T
以上代碼中,我們通過(guò) bcp 命令行工具,使用查詢語(yǔ)句將遠(yuǎn)程服務(wù)器中的表數(shù)據(jù)導(dǎo)出到本地文件中,然后再將文件中的數(shù)據(jù)導(dǎo)入到本地?cái)?shù)據(jù)庫(kù)中。
:
在不同的場(chǎng)景中,我們可以選擇不同的方法來(lái)實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)復(fù)制表數(shù)據(jù)的功能,每種方法都有不同的優(yōu)缺點(diǎn),我們可以根據(jù)具體情況選擇最合適的方式。
相關(guān)問(wèn)題拓展閱讀:
- 如何實(shí)現(xiàn)MS SQL中同一數(shù)據(jù)庫(kù)中表與表之間的數(shù)據(jù)復(fù)制?
如何實(shí)現(xiàn)MS SQL中同一數(shù)據(jù)庫(kù)中表與表之間的數(shù)據(jù)復(fù)制?
1. 通過(guò)工具DTS的設(shè)計(jì)器進(jìn)行導(dǎo)入或?qū)С?/p>
DTS的設(shè)計(jì)器功能強(qiáng)大,支持多任務(wù),也是可視化界面,容易操作,但知道的人一般不多,如果只是御鍵沒(méi)進(jìn)行SQL Server數(shù)據(jù)庫(kù)中部分表的移動(dòng),用這種方法更好,當(dāng)然,也可以進(jìn)行全部表的移動(dòng)。在SQL Server Enterprise Manager中,展開(kāi)服務(wù)器左邊的+,選擇數(shù)據(jù)庫(kù),右擊,選擇All tasks/Import Data…(或All tasks/Export Data…),進(jìn)入向?qū)J?,按提示一步一步走就行了,里面分得很?xì),可以靈活的在不同數(shù)據(jù)源之間復(fù)制數(shù)據(jù),很方便的。而且可以另存成DTS包,如果以后還有相同的復(fù)制任務(wù),直接運(yùn)鎮(zhèn)納行DTS包就行,省時(shí)省力。也可以直接打開(kāi)DTS設(shè)計(jì)器,方法是展開(kāi)服務(wù)器名稱下面的Data Transformation Services,選Local Packages,在右邊的窗口中右擊,選New Package,就打開(kāi)了DTS設(shè)計(jì)器。值得注意的是:如果源數(shù)據(jù)庫(kù)要拷貝的表有外鍵,注意移動(dòng)的順序,有時(shí)要分批移動(dòng),否則外鍵主鍵,索引可能丟失,移動(dòng)的時(shí)候選項(xiàng)旁邊的提示說(shuō)的很明白,或者一次性的復(fù)制到目標(biāo)數(shù)據(jù)庫(kù)中,再重新建立外鍵,主鍵,索引。
其實(shí)建立數(shù)據(jù)庫(kù)時(shí),建立外鍵,主鍵,索引的文件應(yīng)該和建表文件分開(kāi),而且用的數(shù)據(jù)文件也分開(kāi),并分別放在不同的驅(qū)動(dòng)器上,有利于數(shù)據(jù)庫(kù)的優(yōu)化。
2. 利用Bcp工具
這種工具雖然在SQL Server7的版本中不推薦使用,但許多數(shù)據(jù)庫(kù)管理員仍很喜歡用它,尤其是用過(guò)SQL Server早期版本的人。Bcp有局限性,首先它的界面不是圖形化的,其次它只是在SQL Server的表(視圖)與文本文件之間進(jìn)行復(fù)制,但它的優(yōu)點(diǎn)是性能好,開(kāi)銷小,占用內(nèi)存少,速度快。有興趣的朋友可以查參考手冊(cè)。
3. 利用備份和恢復(fù)
先對(duì)源數(shù)據(jù)庫(kù)進(jìn)行完全備份,備份到一個(gè)設(shè)備(device)上,然后把備份文件復(fù)制到目的服務(wù)器上(恢復(fù)的速度快),進(jìn)行數(shù)據(jù)庫(kù)的恢復(fù)操作,在恢復(fù)的數(shù)據(jù)庫(kù)名中填上源數(shù)據(jù)庫(kù)的名字(名字必須相同),選擇強(qiáng)制型恢復(fù)(可以覆蓋以前數(shù)據(jù)庫(kù)的選項(xiàng)),在選擇從設(shè)備中進(jìn)行恢復(fù),瀏覽時(shí)選中備份的文件就行了。這種方法可以完全恢復(fù)數(shù)據(jù)庫(kù),包括外鍵,主鍵,索引。
4. 直接拷貝數(shù)據(jù)文件
把數(shù)據(jù)庫(kù)的數(shù)據(jù)文件(*.mdf)和日志文件(*.ldf)都拷貝到目的服務(wù)器,在SQL Server Query Analyzer中用語(yǔ)句進(jìn)行恢復(fù):
EXEC sp_attach_db @dbname = ‘test’,
@filename1 = ‘d:\mssql7\data\test_data.mdf’,
@filename2 = ‘d:\mssql7\data\test_log.ldf’
這樣就把test數(shù)據(jù)庫(kù)附加到SQL Server中,可以照常使用。如果不想用原來(lái)的日志文件,可以用如下的命令:
EXEC sp_detach_db @dbname = ‘test’
EXEC sp_attach_single_file_db @dbname = ‘test’,
@physname = ‘d:\mssql7\data\test_data.mdf’
這個(gè)語(yǔ)句的作用是僅僅加載數(shù)據(jù)文件,日志文件可以由SQL Server數(shù)據(jù)庫(kù)自動(dòng)添加,但是亮蠢原來(lái)的日志文件中記錄的數(shù)據(jù)就丟失了。
5. 在應(yīng)用程序中定制
可以在應(yīng)用程序(PB、VB)中執(zhí)行自己編寫的程序,也可以在Query Analyzer中執(zhí)行,這種方法比較靈活,其實(shí)是利用一個(gè)平臺(tái)連接到數(shù)據(jù)庫(kù),在平臺(tái)中用的主要時(shí)SQL語(yǔ)句,這種方法對(duì)數(shù)據(jù)庫(kù)的影響小,但是如果用到遠(yuǎn)程鏈接服務(wù)器,要求網(wǎng)絡(luò)之間的傳輸性能好,一般有兩種語(yǔ)句:
1> select … into new_tablename where …
2> insert (into) old_tablename select … from … where …
區(qū)別是前者把數(shù)據(jù)插入一個(gè)新表(先建立表,再插入數(shù)據(jù)),后者是把數(shù)據(jù)插入已經(jīng)存在的一個(gè)表中,我個(gè)人喜歡后者,因?yàn)樵诰幊痰慕Y(jié)構(gòu)上,應(yīng)用的范圍上,第二條語(yǔ)句強(qiáng)于前者。
6. SQL Server的復(fù)制功能
SQL Server提供了強(qiáng)大的數(shù)據(jù)復(fù)制功能,也是最不易掌握的,具體應(yīng)用請(qǐng)參考相關(guān)資料,值得注意的是要想成功進(jìn)行數(shù)據(jù)的復(fù)制工作,有些條件是必不可少的:
1>SQL Server Agent必須啟動(dòng),MSDTC必須啟動(dòng)。
2>所有要復(fù)制的表必須有主鍵。
3>如果表中有text或image數(shù)據(jù)類型,必須使用with log選項(xiàng),不能使用with no_log選項(xiàng)。
另外max text repl size選項(xiàng)控制可以復(fù)制的文本和圖像數(shù)據(jù)的更大規(guī)模,超過(guò)這個(gè)限制的操作將失敗。
4>在要進(jìn)行復(fù)制的計(jì)算機(jī)上,應(yīng)該至少是隱含共享,即共享名是C$或D$…。
5>為SQL Server代理使用的Windows NT帳號(hào)不能是一個(gè)本地的系統(tǒng)帳號(hào),因?yàn)楸镜氐南到y(tǒng)帳號(hào)不允許網(wǎng)絡(luò)存取。
6>如果參與復(fù)制的服務(wù)器在另外的計(jì)算機(jī)域中,必須在這些域之間建立信任關(guān)系。本人從事的工作是數(shù)據(jù)庫(kù)管理員,要維護(hù)多臺(tái)服務(wù)器中的數(shù)據(jù)庫(kù),經(jīng)常把某臺(tái)服務(wù)器中的某個(gè)數(shù)據(jù)庫(kù)移動(dòng)到另外一臺(tái)服務(wù)器,對(duì)數(shù)據(jù)的移動(dòng)有些心得體會(huì),希望和大家共同交流。
select into * from 表名
可以。支持。要的就是樓上這為大蝦的謹(jǐn)慎。
支持二樓的方法!
sql不同數(shù)據(jù)庫(kù)間復(fù)制表部分?jǐn)?shù)據(jù)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于sql不同數(shù)據(jù)庫(kù)間復(fù)制表部分?jǐn)?shù)據(jù),SQL實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)復(fù)制表數(shù)據(jù)方法,如何實(shí)現(xiàn)MS SQL中同一數(shù)據(jù)庫(kù)中表與表之間的數(shù)據(jù)復(fù)制?的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開(kāi)發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),營(yíng)銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
本文名稱:SQL實(shí)現(xiàn)跨數(shù)據(jù)庫(kù)復(fù)制表數(shù)據(jù)方法 (sql不同數(shù)據(jù)庫(kù)間復(fù)制表部分?jǐn)?shù)據(jù))
文章分享:http://m.fisionsoft.com.cn/article/cdipods.html


咨詢
建站咨詢
