儲存過程呼叫不同資料庫的資料

taogchan發表於2012-12-07
儲存過程呼叫不同資料庫的資料
在儲存過程呼叫不同資料庫的資料該如何做,比如在儲存過程名為AAA的儲存過程裡面呼叫資料庫為hudu1,hudu2,hudu3裡面的資料來統計?
在同一臺資料庫伺服器上:  
select   *   from   hudu1.dbo.表名  
select   *   from   hudu2.dbo.表名  
select   *   from   hudu3.dbo.表名  
   
在不同資料庫伺服器上:  
select   *   from   openrowset('SQLOLEDB','sql伺服器1';'使用者名稱';'密碼',hudu1.dbo.表名)  
select   *   from   openrowset('SQLOLEDB','sql伺服器2';'使用者名稱';'密碼',hudu2.dbo.表名)  
select   *   from   openrowset('SQLOLEDB','sql伺服器3';'使用者名稱';'密碼',hudu3.dbo.表名)
下面的方法可以參考:
方法一:用OPENDATASOURCE   方法去操作異地資料庫  
   
declare   @i   int  
set   @i=1  
select   *   from   OPENDATASOURCE('SQLOLEDB','Data   Source=IP地址;User   ID=sa;Password=密碼').異地資料庫名.dbo.表名   A   inner   join   本地資料庫名..表名   B  
on   A.關聯欄位=B.關聯欄位   and   A.欄位名稱  
   
   
     
--方法二:如果經常訪問或資料量大,建議用連結伺服器  
     
--建立連結伺服器  
exec   sp_addlinkedserver     'srv_lnk','','SQLOLEDB','遠端伺服器名或ip地址'  
exec   sp_addlinkedsrvlogin   'srv_lnk','false',null,'使用者名稱','密碼'  
go  
     
--查詢示例  
select   *   from   srv_lnk.資料庫名.dbo.表名  
     
--匯入示例  
select   *   into   表   from   srv_lnk.資料庫名.dbo.表名  
     
go  
--以後不再使用時刪除連結伺服器  
exec   sp_dropserver   'srv_lnk','droplogins'  
   
     
--如果只是臨時訪問,可以直接用openrowset  
--查詢示例  
select   *   from   openrowset('SQLOLEDB'  
    ,'sql伺服器名';'使用者名稱';'密碼'  
    ,資料庫名.dbo.表名)  
     
   
--匯入示例  
select   *   into   表   from   openrowset('SQLOLEDB'  
    ,'sql伺服器名';'使用者名稱';'密碼'  
    ,資料庫名.dbo.表名) 
   錯誤7405:異類查詢要求為連線設定ANSI-NULL和ANSI-WARNNINGS選項,這將確保一致的查詢語意,請啟用這些選項,然後重新發出查詢
解決方法:
   SET   ANSI_NULLS   ON  
      SET   ANSI_WARNINGS   ON  
       GO  
          CREATE   PROCEDURE   ....
SQL SERVER儲存過程中透過連結伺服器訪問遠端伺服器SQL實戰
SQLSERVER的開發中,經常會碰到跨物理伺服器跨資料庫的訪問和操作。
下面來分析下在儲存過程中建立遠端訪問的完整例子.
需求: 在A伺服器上有Card資料庫,Card資料庫有儲存過程proc_Card;   
在B伺服器上有AccountDB資料庫,AccountDB下有Up_account儲存過程。
現在需要在執行proc_Card最後,呼叫一次Up_account儲存過程,以實現不同服,不同資料庫的資料同步.
分析: 1. 儲存過程中呼叫儲存過程不是問題,
                Execute '儲存過程名字'
                儲存過程引數1=引數1的值,                
                引數2=引數2的值
                 ......
        2. 如何在A服上建立對B伺服器 SQLSERVER的訪問呢?
                首先不得不提的是SQLSERVER連結伺服器,在sql 2K中 企業管理器===>安全性===>連結伺服器.
                SQLSERVER2005 or 2008中 Maragement studio 伺服器物件==>連結伺服器。
                這個連結伺服器物件是如何來的?
                        預設情況下會只有本機一個,連結伺服器名就是本機機器名,透過系統儲存過程Execute     sp_helpserver 可以檢視,顯示為name欄位
   如何新增連結伺服器 ?
   A. 透過嚮導,
    1. 右鍵連結伺服器---&gt新增連結伺服器
          2. 輸入連結伺服器名[ 需要訪問的伺服器的機器名或是IP,如果別名無法解析到,則使用IP ] ,指定伺服器型別為SQL SERVER,
    3. 在安全性中選擇'使用此安全上下文建立連線' 指定需要訪問的伺服器的SQL 登入賬號和密碼
    4。點確定,重新整理連結伺服器,則可視配置的連結伺服器資訊
         B. 透過系統儲存過程,
    建立連結sql server伺服器,通常有兩種情況:
    1. 第一種情況,產品選”sql server”
     EXEC sp_addlinkedserver
     @server='linkServerName',
     @srvproduct = N'SQL Server'
     這種情況,@server (linkServerName)就是要連結的sqlserver伺服器名或者ip地址。
    2.第二種情況,訪問介面選“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”
     EXEC sp_addlinkedserver  
     @server=' linkServerName ',
     @srvproduct='',
     @provider='SQLNCLI',
     @datasrc='sqlServerName'
     這種情況,@datasrc(sqlServerName)就是要連結的實際sqlserver伺服器名或者ip地址。
    3.Sql server資料庫引擎是透過上面設定的伺服器名或者ip地址訪問連結伺服器,DTC服務也是透過伺服器名或者ip地址訪問連結伺服器,所以要保證資料庫引擎和DTC都能透過伺服器名或者ip地址訪問到連結伺服器。
   建立了連結,建立了資料庫的登入訪問:
    EXEC sp_addlinkedsrvlogin
    '上面建立的連結伺服器的別名或是IP', --被訪問的伺服器別名
    'false',
    NULL,
    '賬號', --帳號
    '登入密碼' --密碼
   接下來就可以透過連結伺服器來訪問伺服器B的AccountDB庫下up_account儲存過程了:
    Execute [連結伺服器別名].庫名.dbo.儲存過程
   工作似乎已經結束了,但此時發現,執行存A服儲存過程時會報 '未將[所用到的別名] 伺服器配置為可用的RPC' ,如何解決?
          很簡單,檢視連結伺服器的選項,將RPC RPC_Out 值由False 改為 TRUE 再除錯,成功!
    也有情況在這裡無法更改,解決方案是:
     exec sp_configure 'show advanced options', 1; --預設是0   
     GO  
     RECONFIGURE WITH OVERRIDE;
     GO
儲存過程呼叫不同資料庫的資料_SQL SERVER儲存過程中透過連結伺服器訪問遠端伺服器SQL實戰_SQLSERVER跨平臺資料訪問

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22392018/viewspace-750745/,如需轉載,請註明出處,否則將追究法律責任。

相關文章