SQL跨數據庫服務器查詢和跨表更新的操作

SQL跨數據庫服務器查詢和跨表更新的操作

SQL Server數據庫跨數據庫服務器查詢和跨表更新的相關知識是本文我們主要要介紹的內容,接下來我們就通過一個實例來介紹這一過程。實例是這樣的:想實現的功能很簡單, 在我的本地一個表用來保存省的信息: T_Province,在另外一臺服務器上也有一個保存省的表province,其中有我本地沒有的provience_name_en和provience_id信息.我希望將它們保存到我的表中.

準備工作

首先我在本地 T_Province 表中添加了 ProvinceNameEn 和 ProvinceId 兩個字段.接下來就要想辦法爲這兩個字段填充數據.

跨服務器查詢

首先需要解決跨服務器查詢的問題. 先來看我的最終實現:

--創建鏈接服務器

exec sp_addlinkedserver @server= 'SQL2', @srvproduct= '',  

@provider='SQLNCLI', @datasrc = '192.168.9.123' --登錄鏈接服務器  

exec sp_addlinkedsrvlogin @rmtsrvname = 'SQL2',  

@useself = 'false ', @locallogin = null,  

@rmtuser ='sa', @rmtpassword = '123456'

上面使用sp_addlinkedserver和sp_addlinkedsrvlogin 與服務器建立了鏈接, 接下來就可以直接查詢遠程服務器上的數據了:

--創建臨時表  

create table #t (ProvinceName nvarchar(50), ProvinceNameEn nvarchar(50),  

ProvinceID nvarchar(50)) INSERT INTO #t(ProvinceName, ProvinceNameEn, ProvinceID)  

( SELECT localDB.ProvinceName, serverDB.province_name_en, serverDB.province_ID  

FROM T_Province as localDB, SQL2.bdg_web_retail.dbo.province  

as serverDB WHERE localDB.ProvinceName = serverDB.Province_Name )  

--跨服務器查詢生成的臨時表結果  

SELECT * FROM #t

通過上面的SQL語句,我將兩個服務器,兩個數據庫的兩個表做了內聯查詢,並且將結果保存到了本地的臨時表#t中.

跨表更新

接下來希望將#t 中的數據更新到T_Province表中.其實跨表更新很簡單, 但是一開始頭腦中這個概念, 不知道set子句如何寫.下面是最後的成果:

--更新本地的 T_Province表數據

UPDATE T_Province SET T_Province.ProvinceNameEn = ( SELECT #t.ProvinceNameEn) , T_Province.ProvinceID = (SELECT #t.ProvinceID)  

ROM T_Province, #t WHERE T_Province.ProvinceName = #t.ProvinceName

需要注意的是我最開始使用了Declare建立表變量的形式創建了@t,但是執行update操作時提示"必須聲明標量變量@t", 換成了臨時表#t就沒有問題。

跨服務器查詢相關知識

下面對跨服務器查詢用到的知識進行講解.

創建鏈接服務器 sp_addlinkedserver

創建鏈接服務器。鏈接服務器讓用戶可以對OLE DB 數據源進行分佈式異類查詢。在使用 sp_addlinkedserver 創建鏈接服務器後,可對該服務器運行分佈式查詢。如果鏈接服務器定義爲 SQL Server 實例,則可執行遠程存儲過程。

語法

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] [ , [ @provider= ] 'provider_name' ] [ , [ @datasrc= ] 'data_source' ] [ , [ @location= ] 'location' ] [ , [ @provstr= ] 'provider_string' ] [ , [ @catalog= ] 'catalog' ]

參數

[ @server = ] 'server'

要創建的鏈接服務器的名稱。server 的數據類型爲 sysname,沒有默認值。

[ @srvproduct = ] 'product_name'

要添加爲鏈接服務器的OLE DB 數據源的產品名稱。product_name 的數據類型爲 nvarchar(128),默認值爲 NULL。如果爲 SQL Server,則不必指定 provider_name、data_source、location、provider_string 和 catalog。

[ @provider = ] 'provider_name'

與此數據源對應的 OLE DB 訪問接口的唯一編程標識符 (PROGID)。對於當前計算機中安裝的指定 OLE DB 訪問接口,provider_name 必須唯一。provider_name 的數據類型爲 nvarchar(128),默認值爲 NULL;但如果忽略 provider_name,則使用 SQLNCLI。SQLNCLI 是 SQL 本機 OLE DB 訪問接口。OLE DB 訪問接口應以指定的 PROGID 在註冊表中註冊。

[ @datasrc = ] 'data_source'

由OLE DB 訪問接口解釋的數據源的名稱。data_source 的數據類型爲 nvarchar(4000)。data_source 作爲 DBPROP_INIT_DATASOURCE 屬性傳遞以初始化 OLE DB 訪問接口。

[ @location = ] 'location'

由 OLE DB 訪問接口解釋的數據庫的位置。location 的數據類型爲 nvarchar(4000),默認值爲 NULL。location 作爲 DBPROP_INIT_LOCATION 屬性傳遞以初始化 OLE DB 訪問接口。

[ @provstr = ] 'provider_string'

OLE DB 訪問接口特定的連接字符串,它可標識唯一的數據源。provider_string 的數據類型爲 nvarchar(4000),默認值爲 NULL。provstr 或傳遞給 IDataInitialize 或設置爲 DBPROP_INIT_PROVIDERSTRING 屬性以初始化 OLE DB 訪問接口。

在針對 SQL 本機客戶端 OLE DB 訪問接口創建鏈接服務器後,可將 SERVER 關鍵字用作 SERVER=servername\instancename 來指定實例,以指定特定的 SQL Server 實例。servername 是運行 SQL Server 的計算機名稱,instancename 是用戶將連接到的特定 SQL Server 實例的名稱。

[ @catalog = ] 'catalog'

與 OLE DB 訪問接口建立連接時所使用的目錄。catalog 的數據類型爲 sysname,默認值爲 NULL。catalog 作爲 DBPROP_INIT_CATALOG 屬性傳遞以初始化 OLE DB 訪問接口。在針對 SQL Server 實例定義鏈接服務器時,目錄指向鏈接服務器映射到的默認數據庫。

登錄鏈接服務器 sp_addlinkedsrvlogin

語法

sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname' [ , [ @useself = ] 'useself' ] [ , [ @locallogin = ] 'locallogin' ] [ , [ @rmtuser = ] 'rmtuser' ] [ , [ @rmtpassword = ] 'rmtpassword' ]

參數

[ @rmtsrvname = ] 'rmtsrvname'

應用登錄映射的鏈接服務器的名稱。rmtsrvname 的數據類型爲 sysname,沒有默認值。

[ @useself = ] 'useself'

確定用於連接遠程服務器的登錄名。useself 的數據類型爲 varchar(8),默認值爲 TRUE。

值爲true 時指定登錄使用自己的憑據連接 rmtsrvname,忽略 rmtuser 和 rmtpassword 參數。false 指定使用 rmtuser 和 rmtpassword 參數連接指定 locallogin 的 rmtsrvname。如果 rmtuser 和 rmtpassword 也設置爲 NULL,則不使用登錄名或密碼來連接鏈接服務器。

[ @locallogin = ] 'locallogin'

本地服務器上的登錄。locallogin 的數據類型爲 sysname,默認值爲 NULL。NULL 指定此項應用於連接到 rmtsrvname 的所有本地登錄。如果不爲 NULL,則 locallogin 可以是 SQL Server 登錄或Windows 登錄。對於 Windows 登錄來說,必須以直接的方式或通過已被授權訪問的 Windows 組成員身份授予其訪問 SQL Server 的權限。

[ @rmtuser = ] 'rmtuser'

當 useself 爲 false 時,表示用於連接 rmtsrvname 的用戶名。rmtuser 的數據類型爲 sysname,默認值爲 NULL。

[ @rmtpassword = ] 'rmtpassword'

與 rmtuser 關聯的密碼。rmtpassword 的數據類型爲 sysname,默認值爲 NULL。

使用鏈接服務器

服務器名.數據庫名.dbo.表名

刪除鏈接服務器 sp_dropserver

語法

sp_dropserver [ @server = ] 'server' [ , [ @droplogins = ] { 'droplogins' | NULL} ]

參數

[ @server = ] 'server'

要刪除的服務器。server 的數據類型爲 sysname,無默認值。server 必須存在。

[ @droplogins = ] 'droplogins' | NULL

指示如果指定了 droplogins,那麼對於server,還必須刪除相關的遠程服務器和鏈接服務器登錄名。@droplogins 的數據類型爲 char(10),默認值爲 NULL。

關於SQL Server跨數據庫服務器查詢和跨表更新的相關知識就介紹到這裏了,希望本次的介紹能夠對您有所收穫!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章