SQLSERVER調用OPENROWSET的方法


前言:正好這兩天在同步生產環境的某張表數據到測試環境,之前用過一些同步數據軟件,感覺不太可靠,有時候稍有操作不當,就會出現生產環境數據被清空等情況,還要去恢復數據。如果能恢復還好,不能恢復那么......想想就覺得闊怕,后來想起 SQLSERVEROPENROWSET 函數可以通過 T-SQL 訪問遠程數據庫,正好可以使用,看得見的SQL 比 同步數據軟件看起來安心多了,哈哈.... 不講廢話了

 

一、OPENROWSET

  簡介:包含訪問 OLE DB 數據源中的遠程數據所需的所有連接信息。 當訪問鏈接服務器中的表時,這種方法是一種替代方法,並且是一種使用 OLE DB 連接並訪問遠程數據的一次性的臨時方法。 對於較頻繁引用 OLE DB 數據源的情況,請改為使用鏈接服務器。 OPENROWSET 函數可以在查詢的 FROM 子句中引用,就好象它是一個表名。 依據 OLE DB 提供程序的功能,還可以將 OPENROWSET 函數引用為 INSERTUPDATE 或 DELETE 語句的目標表。 盡管查詢可能返回多個結果集,但 OPENROWSET 只返回第一個結果集。

1. 語法詳解

OPENROWSET   
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'   
   | 'provider_string' }   
   , {   [ catalog. ] [ schema. ] object   
       | 'query'   
     }   
} )   
  

 

provider_name:字符串,表示在注冊表中指定的 OLE DB 訪問接口的友好名稱)。 provider_name 沒有默認值 

 

datasource:對應於特定 OLE DB 數據源的字符串常量。 datasource 是要傳遞給提供程序的 IDBProperties 接口的 DBPROP_INIT_DATASOURCE 屬性,該屬性用於初始化提供

       程序 。 通常,此字符串包含數據庫文件的名稱、數據庫服務器的名稱,或者訪問接口能理解的用於定位數據庫的名稱。

 

user_id:字符串常量,它是傳遞給指定 OLE DB 訪問接口的用戶名。 user_id 為連接指定安全上下文,並作為 DBPROP_AUTH_USERID 屬性傳入以初始化提供程序 。

 

password:字符串常量,它是傳遞給 OLE DB 訪問接口的用戶密碼。 在初始化提供程序時,password 作為 DBPROP_AUTH_PASSWORD 屬性傳入 。

 

 

provider_string:訪問接口特定的連接字符串,作為 DBPROP_INIT_PROVIDERSTRING 屬性傳入以初始化 OLE DB 訪問接口。 provider_string 通常封裝初始化提供程序所需的

        所有連接信息 。

 

catalog:指定對象所在的目錄或數據庫的名稱。

 

schema:架構的名稱或指定對象的對象所有者名稱。

 

object:架構的名稱或指定對象的對象所有者名稱。

 

query:字符串常量,發送到訪問接口並由訪問接口執行。 SQL Server 的本地實例不處理該查詢,但處理由訪問接口返回的查詢結果(傳遞查詢)。 有些訪問接口並不通過表名而

    是通過命令語言提供其表格格式數據,將傳遞查詢用於這些訪問接口是非常有用的。 只要查詢提供程序支持 OLE DB Command 對象及其強制接口,那么在遠程服務器上

    就支持傳遞查詢。

 

注:如果 OLE DB 提供程序在指定的數據源中支持多個目錄和架構,那么就需要目錄及架構名稱。如果 OLE DB 提供程序並不支持目錄和架構,那么可以省略 catalog 及 schema 的

  值。 如果提供程序只支持架構名,那么必須指定一個兩部分名稱,形式為 schema.object。如果提供程序只支持目錄名,那么必須指定一個三部分名稱

  ,形式為 catalog.schema.object。

 

  OPENROWSET 不接受參數變量。

 

權限:OPENROWSET 權限由傳遞到 OLE DB 提供程序的用戶名的權限確定。 

 

2. 示例

 

SELECT * FROM  OPENROWSET('SQLNCLI',
'server=IP地址;uid=賬號;pwd=密碼;database=數據庫名稱',
'SELECT * FROM _category');

 

3. 錯誤描述

OLE DB 錯誤:OLE DBODBC 錯誤

  發生這種問題是因為 SQL SERVER 只提供一組特定訪問接口的進程內訪問。SQLNCLI.1 是 SQL SERVER 的一個新的本機 OLE DB 訪問接口,它具有訪問權。但是 SQLNCLI.1 是特定於版本的 SQLNCLI 訪問接口,他不在訪問接口的列表中,因此 SQLNCI.1 沒有訪問權,盡管 SQLNCLISQLNCLI.1 完全相同(因為 SQLNCLI 指向 SQLNCI.1),但 SQL SERVER 並不能識別出它們是相同的,SQL SERVER 會阻止對 SQLNCI.1 的訪問

 

  要解決此問題,請使用下列方法之一:

  • 在 OLE DB 連接字符串中使用 SQLNCLI 和 SQLOLEDB  代替 SQLNCLI.1
  • SQL SERVER 中,將  SQLNCLI.1 顯示添加到具有進程內訪問權的供應商列表中

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM