不同伺服器不同資料庫兩張表串連查詢使用經驗

來源:互聯網
上載者:User

使用SQL語句串連查詢位於兩個不同的伺服器不同的資料庫中的兩張表,最初將SQL語句寫成以下形式 

 
  1. select * from Product p inner join 
  2. opendatasource('SQLOLEDB','Data Source=Macaco-Online;user ID=sa;password=sa密碼;').Company.dbo.Product p2  
  3. on P.PID=p2.PID  
  4. go  

 執行時出現錯誤提示: 

----------------------------------------------------------------- 

訊息 15281,層級 16,狀態 1,第 1 行 SQL Server 阻止了對組件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的訪問,因為此組件已作為此伺服器安全配置的一部分而被關閉。系統管理員可以通過使用 sp_configure 啟用 'Ad Hoc Distributed Queries'。有關啟用 'Ad Hoc Distributed Queries' 的詳細資料,請參閱 SQL Server 聯機叢書中的 "介面區配置器"。 

----------------------------------------------------------------- 

嗯,這個提示似乎很明確,從上面的提示我們可以知道只要啟用介面區配置器的Ad Hoc Distributed Queries組件即可,隨即把自己機器上資料庫伺服器的介面區配置器開啟,找到Ad Hoc Distributed Queries組件並將其啟用啟用步驟:右擊自己的資料庫伺服器,在右鍵菜單中選擇“方面” 在彈出的的視窗中有一個名為方面的下拉式清單先項點開後選擇“介面區配置器”選項,然後在下面的方面屬性視窗中將AdHocremoteQueriesEnabled的狀態改成true點擊確定即要可)。

現在就可以執行上面的應該查詢語句了。

但是,這似乎並不能滿足我們的需要 

例如:我們要在自己的程式中做這樣的的查詢那該怎麼辦呢?總不能一直這樣開著吧,這可是對伺服器有安全損耗的。嗯,我可不會就這樣把自己伺服器的安全層級降低哦。

好吧,我們現在需要使用SQL命令來啟用和禁用這個組件,但是怎麼做呢? 不要急再分析一下上面出錯時的提醒我們便可以知道使用SP_Configure便可以啟用禁用這個組件了,現在改變我們的SQL命令如下所示:

 
  1. exec sp_configure 'show advanced options',1  
  2. reconfigure  
  3. exec sp_configure 'Ad Hoc Distributed Queries',1  
  4. reconfigure  
  5. go  
  6.  
  7. select * from Product p inner join 
  8. opendatasource('SQLOLEDB','Data Source=Macaco-Online;user ID=sa;password=sa密碼;').Company.dbo.Product p2  
  9. on P.PID=p2.PID  
  10. go  
  11.  
  12. exec sp_configure 'Ad Hoc Distributed Queries',0  
  13. reconfigure  
  14. exec sp_configure 'show advanced options',0  
  15. reconfigure  
  16.    
  17.  
  18. go   

嗯,這樣我們就可以在需要啟用這樣組件的時候啟用即可註:Ad Hoc Distributed Queries是進階配置所以需要先啟用Show advanced options ,也就是說無論你是要啟用Ad Hoc Distributed Queries,還是禁用都必須保證show advanced options為啟用狀態)有些朋友便疑惑了,你這樣又是預存程序,又是SQL語句的,我在程式裡該執行什麼類型的命令啊?呵呵,其實, SqlCommand對象執行命令時,就象是我們用Microsoft SQL Server Management Studio建立了一個查詢時段一樣,在這個查詢時段裡,你可以執行什麼 SqlCommand對象就可以執行什麼,所以你只要將上面的sql命令中的分行符號替換成空格組成一串字串然後把他賦值給SqlCommand對象的CommadnTest屬性,然後執行就可以了哦,好像我還沒有使用這種方法建立資料庫,不過如果你串連資料庫使用的使用者權限足夠的話,應該也沒有什麼問題!)

補充閱讀:

來源:部落格園

作者:鄒澤棟

1,一個伺服器中兩個不同資料庫的兩個表查詢

select * from 資料庫1.表名 A,資料庫2.表名 b on A.Id=B.Ids

2,同一庫中兩表或多表的查詢方式

兩表查詢 select * from TB1 left join TB2 On tb1.where = tb2.where 或者 select * from TB1 ,TB2  where tb1.where = tb2.where

多表查詢    select * from tb1 left  join tb2  on tb1.where =tb2.where inner join tb3 on (tb3.wehre = tb2.where) inner join tb4.......................

cross join:是笛卡兒乘積,在沒有任何條件約束下就是一張表的行數乘以別一張表的行數。
left join:返回“表名1”的全部行,對於“表名2”中,不滿足on條件的記錄用空值替換。
rigth join:返回“表名2”的全部行,對於“表名1”中,不滿足on條件的記錄用空值替換。
full join:返回兩張表中的所有記錄,對於不滿足on條件一端的記錄用空值替換。
inner jon:只返回兩張表中都滿足on條件的記錄

原文連結:http://www.cnblogs.com/zouzedong/archive/2011/02/27/1966534.html

編輯精選】

  1. 一些常用的SQL語句
  2. 查詢表結構的SQL語句
  3. 使用SQL語句查詢時間段
  4. 巧用SQL語句重複資料刪除記錄
  5. 判斷欄位是否存在的SQL語句寫法

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.