OpenRowSet函數可用於在sql語句中連接遠程數據庫。在下面的例子中,遠程數據庫Northwind.mdb在語句中與Jet4.0接口連接,其他數據庫可以參照其接口參數進行修改。
使用北風
去
選擇c.*,o.*
來自Northwind.dbo.Customers作為c
內部聯接OPENROWSET('Microsoft。Jet.OLEDB.4.0 ',
c:\ Program Files \ Microsoft Office \ Office 11 \ SAMPLES \ north wind . MDB ';admin ';',訂單)
作為o
ON c.CustomerID = o.CustomerID
去
以下是SQL Server 2005聯機叢書的資料,對Sql server 2000仍然有效。
OPENROWSET (Transact-SQL)
包含訪問OLE DB數據源中的遠程數據所需的所有連接信息。當訪問鏈接服務器中的表時,此方法是壹種替代方法,並且是使用OLE DB連接和訪問遠程數據的壹次性臨時方法。若要更頻繁地引用OLE DB數據源,請改用鏈接服務器。有關詳細信息,請參閱鏈接服務器。在查詢的FROM子句中,可以像引用表名壹樣引用OPENROWSET函數。根據OLE DB訪問接口的函數,還可以將OPENROWSET函數作為INSERT、UPDATE或DELETE語句的目標表。盡管查詢可能返回多個結果集,但OPENROWSET只返回第壹個結果集。
OPENROWSET還通過內置的批量訪問接口支持大容量操作,使用該接口可以從文件中讀取數據並作為行集返回。
Transact-SQL語法約定
語法
OPENROWSET
({ 'provider_name ',{ ' datasourceuser _ id ';'密碼'
| '提供者字符串' }
,{ [目錄。] [模式。]對象
| '查詢'
}
|大容量'數據文件',
{ format file = ' format _ file _ path '[& lt;bulk _ options & gt]
| SINGLE _ BLOB | SINGLE _ CLOB | SINGLE _ NCLOB }
} )
& ltbulk _ options & gt::=
[,code page = { ' ACP ' | ' OEM ' | ' RAW ' | ' code _ page ' }]
[,ERRORFILE = '文件名']
[,FIRSTROW = first_row ]
[,LASTROW = last_row ]
[,MAXERRORS = maximum_errors ]
[,每批行數=每批行數]
參數
'提供商名稱'
壹個字符串,表示註冊表中指定的OLE DB訪問接口的友好名稱(或PROGID)。Provider_name沒有默認值。
'數據源'
對應於特定OLE DB數據源的字符串常量。Datasource是要傳遞給提供程序的IDBProperties接口的DBPROP_INIT_DATASOURCE屬性,用於初始化提供程序。通常,該字符串包含數據庫文件的名稱、數據庫服務器的名稱或提供程序可以理解以定位數據庫的名稱。
'用戶標識'
壹個字符串常量,是傳遞給指定OLE DB訪問接口的用戶名。User_id指定連接的安全上下文,並作為DBPROP_AUTH_USERID屬性傳入以初始化提供程序。User_id不能是Microsoft Windows登錄名。
'密碼'
壹個字符串常量,是傳遞給OLE DB訪問接口的用戶密碼。初始化提供程序時,Password作為DBPROP_AUTH_PASSWORD屬性傳入。密碼不能是Microsoft Windows密碼。
'提供者_字符串'
提供程序特定的連接字符串作為DBPROP_INIT_PROVIDERSTRING屬性傳入,以初始化OLE DB提供程序。通常,provider_string封裝了初始化提供程序所需的所有連接信息。如需SQL Native Client OLE DB提供者可辨識的關鍵字清單,請參閱初始化和授權屬性。
目錄
指定對象所在的目錄或數據庫的名稱。
(計劃或理論的)綱要
架構的名稱或指定對象的對象所有者的名稱。
目標
對象名,唯壹標識要操作的對象。
'查詢'
發送到提供程序並由提供程序執行的字符串常量。SQL Server的本地實例不處理查詢,但處理提供程序返回的查詢結果(傳遞查詢)。壹些訪問接口不是通過表名而是通過命令語言提供它們的表格數據,對於這些訪問接口使用傳遞查詢非常有用。只要查詢提供程序支持OLE DB命令對象及其強制接口,遠程服務器就支持傳遞查詢。如需詳細資訊,請參閱SQL native client (ole db)參考。
大部分
使用OPENROWSET的大容量行集提供程序讀取文件中的數據。在SQL Server 2005中,OPENROWSET可以讀取數據文件中的數據,而無需將其加載到目標表中。這允許在單個SELECT語句中使用OPENROWSET。
BULK選項的參數可以提供對何時開始和結束數據讀取、如何處理錯誤以及如何解釋數據的有效控制。例如,您可以指定將數據文件作為varbinary、varchar或nvarchar類型的單行和單列行集讀取。默認行為在以下參數描述中有詳細說明。
有關如何使用BULK選項的信息,請參見本主題後面的“備註”部分。有關批量選項所需權限的信息,請參閱本主題後面的“權限”壹節。
註意:
OPENROWSET(大容量...)在完整恢復模式下用於導入數據時不會優化日誌記錄。
有關為大容量導入準備數據的信息,請參閱為大容量導出或大容量導入準備數據。
'數據文件'
其數據將被復制到目標表的數據文件的完整路徑。
格式文件= '格式文件路徑'
指定格式化文件的完整路徑。SQL Server 2005支持兩種格式文件類型:XML和非XML。
格式化文件是定義結果集中的列類型所必需的。唯壹的例外是當SINGLE _ CLOB指定了SINGLE_BLOB或SINGLE _ NCLOB在這種情況下,不需要格式化文件。
有關格式化文件的信息,請參見使用格式化文件大容量導入數據。
& ltbulk _ options & gt
指定BULK選項的壹個或多個參數。
code page = { ' ACP ' | ' OEM ' | ' RAW ' | ' code _ page ' }
指定此數據文件中數據的代碼頁。僅當數據包含字符值大於127或小於32的char、varchar或text列時,CODEPAGE才適用。
代碼頁值描述
酰基-載體蛋白質(Acyl Carrier Protein)
將數據類型為char、varchar或text的列從ANSI/Microsoft Windows代碼頁(ISO 1252)轉換為SQL Server代碼頁。
OEM(默認)
將數據類型為char、varchar或text的列從系統OEM代碼頁轉換為SQL Server代碼頁。
生的
不執行從壹個代碼頁到另壹個代碼頁的轉換。這是最快的選擇。
代碼頁
指示編碼數據文件中字符數據所在的源代碼頁;比如850。此代碼頁是SQL Server 2005數據庫引擎正確解釋輸入數據所必需的。
錯誤文件= '文件名'
指定用於收集格式錯誤且無法轉換為OLE DB行集的行的文件。這些行按原樣從數據文件復制到此錯誤文件。
命令啟動時會創建錯誤文件。如果該文件已經存在,將會引發壹個錯誤。此外,還創建了擴展名為ERROR.txt的控制文件。該文件引用錯誤文件中的每壹行,並提供錯誤診斷。糾正錯誤後,可以加載數據。
FIRSTROW = first_row
指定要加載的第壹行的行號。默認值為1,表示指定數據文件的第壹行。通過計算行終止符來確定行號。
LASTROW =最後壹行
指定要加載的最後壹行的行號。默認值為0,表示指定數據文件中的最後壹行。
MAXERRORS = maximum_errors
指定在OPENROWSET引發異常之前,格式文件中定義的語法錯誤或格式錯誤行的最大數量。在達到MAXERRORS之前,OPENROWSET會忽略每個錯誤行,不加載它,並將其視為壹個錯誤。
maximum_errors的默認值是10。
註意:
MAX_ERRORS不適用於CHECK約束,也不適用於money和bigint數據類型的轉換。
ROWS _ PER _ BATCH = rows _ per _ batch
指定數據文件中數據行的大致數量。該值應該與實際行數相同。
OPENROWSET總是在壹個批處理中導入數據文件。但是如果rows_per_batch的值指定為>;0,則在查詢計劃中分配資源時,查詢處理器將使用rows_per_batch的值作為提示。
默認情況下,ROWS_PER_BATCH未知。指定ROWS_PER_BATCH = 0相當於忽略ROWS_PER_BATCH。
SINGLE_BLOB
將data_file的內容作為varbinary(max)類型的單行單列行集返回。
重要提示:
我們建議您只使用SINGLE_BLOB選項(而不是SINGLE_CLOB和SINGLE_NCLOB)來導入XML數據,因為只有SINGLE_BLOB支持所有Windows代碼轉換。
SINGLE_CLOB
通過讀取ASCII格式的data_file,使用當前數據庫的排序規則將內容作為varchar(max)類型的單行和單列行集返回。
SINGLE_NCLOB
通過讀取UNICODE格式的data_file,使用當前數據庫的排序規則將內容作為nvarchar(max)類型的單行和單列行集返回。
評論
當指定提供程序的DisallowAdhocAccess註冊表選項顯式設置為0並且啟用了即席分布式查詢高級配置選項時,OPENROWSET只能用於訪問OLE DB數據源中的遠程數據。如果未設置這些選項,默認行為不允許臨時訪問。
當訪問遠程OLE DB數據源時,服務器不會自動委托可信連接的登錄ID,客戶端可以通過該登錄ID連接到被查詢的服務器。必須配置身份驗證委托。有關詳細信息,請參閱為代理配置鏈接服務器。
如果OLE DB訪問接口支持指定數據源中的多個目錄和架構,則需要目錄和架構名稱。如果OLE DB訪問接口不支持多個目錄和架構,則可以忽略catalog和schema的值。如果提供程序僅支持架構名稱,則必須以schema.object格式指定由兩部分組成的名稱。如果提供程序僅支持目錄名稱,則必須以catalog.schema.object格式指定由三部分組成的名稱。對於使用SQL Native Client OLE DB提供程序的傳遞查詢,必須指定由三部分組成的名稱。有關詳細信息,請參閱Transact-SQL語法約定(Transact-SQL)。
OPENROWSET不接受參數變量。
將OPENROWSET與BULK選項壹起使用
下列Transact-SQL增強功能支持OPENROWSET(BULK…)函數:
與SELECT壹起使用的FROM子句可以調用OPENROWSET(BULK…)而不是表名,可以實現完整的SELECT函數。
帶有BULK選項的OPENROWSET在FROM子句中需要壹個相關名稱,也稱為範圍變量或別名。您可以指定列別名。如果未指定列別名列表,格式化文件必須有列名。指定列別名會覆蓋格式化文件中的列名,例如:
來自OPENROWSET(大容量...)作為表別名
來自OPENROWSET(大容量...)作為table_alias(column_alias,...n)
精選...來自OPENROWSET(大容量...)語句將直接查詢文件中的數據,而不將數據導入表中。精選...來自OPENROWSET(大容量...)語句還可以通過使用格式化文件指定列名和數據類型來列出大容量列別名。
該插件...select * from openrowset(大容量...)語句將數據文件中的數據批量導入到SQL Server表中。有關更多信息,請參見使用BULK INSERT或OPENROWSET(BULK)導入大容量數據...).
當OPENROWSET BULK選項與INSERT語句壹起使用時,BULK子句支持表提示。除了TABLOCK等常規表提示之外,BULK子句還可以接受以下特殊表提示:IGNORE_CONSTRAINTS(僅忽略CHECK和FOREIGN KEY約束)、IGNORE_TRIGGERS、KEEPDEFAULTS和KEEPIDENTITY。有關詳細信息,請參閱表提示(Transact-SQL)。
有關如何使用插頁的信息...select * from openrowset(大容量...)語句,請參見導入和導出批量數據。有關何時在事務日誌中記錄由大容量導入執行的行插入操作的信息,請參閱大容量導入中最低限度日誌記錄的先決條件。
註意:
使用OPENROWSET時,了解SQL Server 2005如何處理模擬非常重要。有關安全註意事項的信息,請參見使用BULK INSERT或OPENROWSET導入大容量數據(Bulk...).
大容量導出或導入SQLXML文檔
若要大容量導出或導入SQLXML數據,請在格式化文件中使用下列數據類型之壹。
數據類型效應
SQLCHAR或SQLVARYCHAR
在客戶端代碼頁或排序規則隱含的代碼頁中發送數據。
SQLNCHAR或SQLNVARCHAR
以Unicode格式發送數據。
SQLBINARY或SQLVARYBIN
發送沒有任何轉換的數據。
權限
OPENROWSET權限由傳遞給OLE DB訪問接口的用戶名的權限決定。若要使用批量選項,您需要“管理批量操作”權限。
例子
A.對SELECT和SQL Native Client OLE DB訪問接口使用OPENROWSET。
以下示例使用SQL Native Client OLE DB訪問接口(SQLNCLI)來訪問表HumanResources。該文件位於遠程服務器Seattle1上的AdventureWorks數據庫中。使用SELECT語句定義返回的行集。提供者字符串包含Server和Trusted_Connection關鍵字。SQL Native Client OLE DB訪問接口可以識別這些關鍵字。
復制代碼
選擇壹個. *
FROM OPENROWSET('SQLNCLI ',' Server = Seattle 1;Trusted _ Connection = yes',
選擇組名,名稱,部門ID
來自冒險工廠。人力資源部
ORDER BY GroupName,Name’)作為;
B.使用Microsoft OLE DB Provider for Jet
以下示例通過Microsoft OLE DB Provider for Jet訪問Microsoft Access Northwind數據庫中的Customers表。
註意:
本示例假定已經安裝了Access。若要運行此示例,必須安裝Northwind數據庫。有關如何安裝Northwind數據庫的更多信息,請參見下載Northwind和pubs示例數據庫。
復制代碼
選擇客戶ID,公司名稱
來自OPENROWSET('Microsoft。Jet.OLEDB.4.0 ',
c:\ Program Files \ Microsoft Office \ Office 11 \ SAMPLES \ north wind . MDB ';
admin ';',客戶)
去
C.在OPENROWSET和內部聯接中使用另壹個表
以下示例選擇存儲在同壹臺計算機上的SQL Server Northwind數據庫本地實例中的Customers表和Access Northwind數據庫中的Orders表中的所有數據。
註意:
本示例假定已經安裝了Access。若要運行此示例,必須安裝Northwind數據庫。有關如何安裝Northwind數據庫的更多信息,請參見下載Northwind和pubs示例數據庫。
復制代碼
使用北風
去
選擇c.*,o.*
來自Northwind.dbo.Customers作為c
內部聯接OPENROWSET('Microsoft。Jet.OLEDB.4.0 ',
c:\ Program Files \ Microsoft Office \ Office 11 \ SAMPLES \ north wind . MDB ';admin ';',訂單)
作為o
ON c.CustomerID = o.CustomerID
去
d、使用OPENROWSET將文件數據大容量插入varbinary(max)列。
下面的示例創建壹個用於演示的小表,並將名為Text1.txt的文件(位於c:)中的文件數據插入到variable (max)列中。
復制代碼
使用AdventureWorks
去
創建表myTable(文件名nvarchar(60),
文件類型nvarchar(60),文檔varbinary(max))
去
插入到我的表格(文件名,文件類型,文檔)
選擇' Text1.txt '作為文件名,
。txt '作為文件類型,
*從OPENROWSET(BULK N ' c:\ text 1 . txt ',SINGLE_BLOB)作為文檔
去
E.使用OPENROWSET大容量提供程序格式化文件以檢索文本文件中的行。
以下示例使用格式化文件從制表符分隔的文本文件values.txt中檢索行,該文件包含以下數據:
復制代碼
1數據項1
2數據項2
3數據項3
格式文件values.fmt描述values.txt中的列:
復制代碼
9.0
2
1 SQL char 0 10 " \ t " 1 ID SQL _ Latin 1 _ General _ CP 437 _ BIN
2 SQLCHAR 0 40 "\r\n" 2描述SQL _ Latin 1 _ General _ CP 437 _ BIN
以下語句是檢索此數據的查詢:
復制代碼
SELECT a . * FROM OPENROWSET(BULK ' c:\ test \ values . txt ',
FORMATFILE = 'c:\test\values.fmt ')作為;