天天看點

SQL 2005 中查詢或執行另外的資料庫操作的方法

 摘要:

如果,你想在一台資料庫伺服器上,查詢另一個台資料伺服器的資料該如何做呢?如果,你想在同一台資料伺服器上,在不同的資料庫之間查詢資料,又該怎麼辦呢?

1.Synonym

2.openquery

3.Linked Servers

     Server Object-->Linked Servers--> serverType 選擇 SQL Server, 在 Security 中 選擇"Be made using this security context"

輸入使用者名和密碼 ,使用:

SELECT * FROM [Galaxy].DataWarehouse.dbo.Fact_Job_Statistics WHERE ...

[轉]資料庫中使用 Synonym和openquery

1, 什麼是Synonym

Synonym(同義詞)是Sql 2005的新特性。推出已經好幾年了。你可以簡單的了解Synonym 為其他表的别名。我們使用Northwind資料庫為例。比如,看下面的例子

SQL 2005 中查詢或執行另外的資料庫操作的方法

Create Synonym MyCustomers FOR Customers

為Customers表建立一個Synonym,叫MyCustomers。 你可以把這個MyCustomers當作一個普通的表,可以對它進行查詢,更新,删除和插入。比如

查詢: Select * from MyCustomers.

插入:  Insert into MyCustomers  (CustomersID, CompanyName) values ('Tom', 'MS')

所有的操作,和普通的表沒有差別。

2, Synonym的應用

在你的程式釋出的時候,你突然發現你需要更改某個表名,或字段名。而你的程式已經不可能修改。這時,怎麼辦呢?那就建立Synonym吧。當然,在 sql2000時代,你可以使用view來做這個事情,或sprocs或udf等。但Synonym有其它所不能的功能,那就是跨資料庫,跨伺服器。

3,Synonym在同一伺服器上的不同資料庫

對于同一伺服器上的不同資料庫,我們可以使用Synonym,将其他資料庫中的表或view或sprocs及udf在本資料庫中映射别名。這樣,就可以不用更改連接配接字元串,而在目前對話資料庫的情況下,擷取其他資料庫的資料,并對它進行,查詢,更新,删除和插入工作。

先假設已經存在Northwind資料庫,然後,再建一個資料庫。我們在新的資料庫上,建立Customer表的Synonym.

SQL 2005 中查詢或執行另外的資料庫操作的方法

Create Synonym MyCustomers For Northiwind.dbo.Customers 

需要注意的是,後面需要寫清那個資料庫,那個表,中間dbo為表的owner.

然後,運作 Insert into MyCustomers  (CustomersID, CompanyName) values ('Tom', 'MS')

和Select * from MyCustomers. 看看是不是真的像普通表那樣。

4, Synonym在不同伺服器上的不同資料庫

假設,我們有一台資料庫伺服器叫SqlTest。上面有個資料庫叫Northwind。我們本地還有一台資料庫伺服器。叫LocalTest. 其上面有一資料庫叫Northwind或其他什麼的。突然有一天,為了使本地的資料庫跑的更快,本地的老資料被移到SqlTest上去了,本地隻儲存最近 更新的。那老資料總還是要用的,怎麼樣實作不同伺服器之間的資料操作呢?那就用Synonym吧。如下

SQL 2005 中查詢或執行另外的資料庫操作的方法

Create Synonym MyCustomers For SqlTest.Northiwind.dbo.Customers 

在上一個例子的基礎上,加了個機器名字而已。就這麼簡單?不是吧?那台伺服器還不一定知道使用者名和密碼呢。恩,是的,還要在本地伺服器上,注冊下遠端的伺服器。使用sp_addlinkedserver,次存儲過程定義如下:

<code>sp_addlinkedserver [ @server = ] 'server'</code>

    <code>[ , [ @srvproduct = ] 'product_name' ]</code>

    <code>[ , [ @provider = ] 'provider_name' ]</code>

    <code>[ , [ @datasrc = ] 'data_source' ]</code>

    <code>[ , [ @location = ] 'location' ]</code>

    <code>[ , [ @provstr = ] 'provider_string' ]</code>

    <code>[ , [ @catalog = ] 'catalog' ]</code>可以運作下面的腳本,将SqlTest注冊到本地

EXEC sp_addlinkedserver

   @server = 'SqlTest',

   @provider = 'MSDASQL',

   @provstr = 'DRIVER={SQL Server};SERVER=SqlTest;UID=sa;PWD=;'

這樣,就可以把遠端資料庫當成本地的來使用。

5,Synonym的其他功能和用UI建立Synonym

Synonym不光可以對表建立,也可以為view,sprocs,以及udf建立相應的Synonym. 如圖:

Sql2005的Server Managerment Studio有這麼一項,選擇後,會出現下面畫面。添入名稱等,選擇object的類型,你就可以選為View,Table, Sprocs和udf建立Synonym了。

6, openquery

相對于Synonym,OpenQuery相對來說,功能就弱了點。其隻是在調用其它資料庫上的sprocs.比如

SQL 2005 中查詢或執行另外的資料庫操作的方法

select * from openquery([SqlTest], 'exec northwind.dbo.[Customers By City] @param1=N''London''') where CustomerID = 'AROUT'

這就是在執行SqlTest伺服器上的,northwind資料庫下的,[Customers By City]的存儲過程。你可以在

7, Linq 對Synonym的支援

目前SqlMetal和OR designer無法對Synonym做映射。但是,使用者依然可以通過手工修改dbml 達到映射的目的。Synonym在Linq中的使用。和其他表等沒有任何差别。

結論:通過Synonym,我們可以實作不同資料庫,以及不同伺服器之間的資料分流。以達到平衡負載的目的,提高效率的目的。