--1.1 創建一個鏈接名
EXEC sp_addlinkedserver 'LinkName','','SQLOLEDB','遠程服務器名或ip地址' --有自定義實例名還要加上"/實例名"
/*例如:EXEC sp_addlinkedserver 'TonyLink','','SQLOLEDB','192.168.58.208' */
--1.2 創建登錄信息(或叫創建鏈接服務器登錄名映射)(只需選擇一種方式)
--1.2.1 以windows認證的方式登錄
EXEC sp_addlinkedsrvlogin 'LinkName' --或EXEC sp_addlinkedsrvlogin 'LinkName','true'
/*例如:EXEC sp_addlinkedsrvlogin 'TonyLink' */
--1.2.2 以SQL認證的方式登錄
EXEC sp_addlinkedsrvlogin 'LinkName','false',NULL,'用戶名','密碼'
/*例如:EXEC sp_addlinkedsrvlogin 'TonyLink','false',null,'sa','123' */
--2. 鏈接服務器相關數據操作
--2.1 查詢示例
SELECT * FROM LinkName.數據庫名.架構名.表名
/*例如:SELECT * FROM TonyLink.Mydb.dbo.tb */
--2.2 導入示例
SELECT * INTO 表名 FROM LinkName.數據庫名.架構名.表名
/*例如:SELECT * INTO Newtb FROM TonyLink.Mydb.dbo.tb */
--2.3 更新示例
UPDATE LinkName.數據庫名.架構名.表名 SET 字段='值' WHERE 字段='條件'
/*例如:UPDATE TonyLink.Mydb.dbo.tb SET Persons='g' WHERE Persons='a' */
--2.4 刪除示例
DELETE LinkName.數據庫名.架構名.表名 WHERE 字段名='條件'
/*例如:DELETE TonyLink.Mydb.dbo.tb WHERE Persons='g' */
--3. 通過行集函數(OPENQUERY/OPENROWSET/OPENDATASOURCE)操作方法
--3.1 OPENQUERY 方法(需要借助剛創建的鏈接服務器):
--3.1.1 查詢示例
SELECT * FROM OPENQUERY(LinkName,'SELECT * FROM 數據庫名.架構名.表名')
/* 例如:SELECT * FROM OPENQUERY(TonyLink,'SELECT * FROM Mydb.dbo.tb') */
--3.1.2 導入示例
--3.1.2.1 導入所有列
INSERT OPENQUERY(LinkName, 'SELECT * FROM 數據庫名.架構名.表名') SELECT * FROM 本地表
/* 例如:INSERT OPENQUERY(TonyLink,'SELECT * FROM Mydb.dbo.tb') SELECT * FROM tb */
--3.1.2.2 導入指定列
INSERT OPENQUERY(LinkName, 'SELECT * FROM 數據庫名.架構名.表名') (列,列...)
SELECT 列,列... FROM 本地表
/* 例如:INSERT OPENQUERY(TonyLink,'SELECT * FROM Mydb.dbo.tb')(RANGE,LEVEL,Persons)
SELECT RANGE,LEVEL,Persons FROM tb
*/
--3.1.3 更新示例
UPDATE OPENQUERY(LinkName, 'SELECT * FROM 數據庫名.架構名.表名') SET 字段='值' WHERE 字段='條件'
/*例如:UPDATE OPENQUERY(TonyLink, 'SELECT * FROM Mydb.dbo.tb') SET Persons='g' WHERE Persons='a' */
--3.1.4 刪除示例
DELETE OPENQUERY(LinkName, 'SELECT * FROM 數據庫名.架構名.表名') WHERE 字段名='條件'
/*例如:DELETE OPENQUERY(TonyLink, 'SELECT * FROM Mydb.dbo.tb') WHERE Persons='g' */
--3.2 OPENROWSET方法(不需要用到創建好的鏈接名。如果連接的實例名不是默認的,需要在"sql服務器名或IP地址"后加上"/實例名")
--3.2.1 查詢示例
--3.2.1.1 Windows認證方式查詢(以下方法之一即可)
SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;Trusted_Connection=yes',數據庫名.架構名.表名)
SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服務器名或IP地址;Trusted_Connection=yes',數據庫名.架構名.表名)
SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;Trusted_Connection=yes','SELECT * FROM 數據庫名.架構名.表名')
SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服務器名或IP地址;Trusted_Connection=yes','SELECT * FROM 數據庫名.架構名.表名')
/* 例如:SELECT * FROM OPENROWSET('SQLOLEDB','Server=192.168.58.208;Trusted_Connection=yes',Mydb.dbo.tb)
或:SELECT * FROM OPENROWSET('SQLNCLI','Server=192.168.58.208;Trusted_Connection=yes',Mydb.dbo.tb)
或:SELECT * FROM OPENROWSET('SQLOLEDB','Server=192.168.58.208;Trusted_Connection=yes','SELECT * FROM Mydb.dbo.tb')
或:SELECT * FROM OPENROWSET('SQLNCLI','Server=192.168.58.208;Trusted_Connection=yes','SELECT * FROM Mydb.dbo.tb')
*/
--3.2.1.2 SQL認證方式查詢(以下方法之一即可)
SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼',數據庫名.架構名.表名)
SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼',數據庫名.架構名.表名)
SELECT * FROM OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼','SELECT * FROM 數據庫名.架構名.表名')
SELECT * FROM OPENROWSET('SQLNCLI', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼','SELECT * FROM 數據庫名.架構名.表名')
SELECT * FROM OPENROWSET('SQLOLEDB', 'sql服務器名';'用戶名'; '密碼',數據庫名.架構名.表名)
SELECT * FROM OPENROWSET('SQLNCLI', 'sql服務器名';'用戶名'; '密碼',數據庫名.架構名.表名)
SELECT * FROM OPENROWSET('SQLOLEDB', 'sql服務器名';'用戶名'; '密碼','SELECT * FROM 數據庫名.架構名.表名')
SELECT * FROM OPENROWSET('SQLNCLI', 'sql服務器名';'用戶名'; '密碼','SELECT * FROM 數據庫名.架構名.表名')
/* 例如:SELECT * FROM OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)
或:SELECT * FROM OPENROWSET('SQLNCLI','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)
或:SELECT * FROM OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123','SELECT * FROM Mydb.dbo.tb')
或:SELECT * FROM OPENROWSET('SQLNCLI','server=192.168.58.208;uid=sa;pwd=123','SELECT * FROM Mydb.dbo.tb')
或:SELECT * FROM OPENROWSET('SQLOLEDB','192.168.58.208';'sa';'123',mydb.dbo.tb)
或:SELECT * FROM OPENROWSET('SQLNCLI','192.168.58.208';'sa';'123',mydb.dbo.tb)
或:SELECT * FROM OPENROWSET('SQLOLEDB','192.168.58.208';'sa';'123','SELECT * FROM Mydb.dbo.tb')
或:SELECT * FROM OPENROWSET('SQLNCLI','192.168.58.208';'sa';'123','SELECT * FROM Mydb.dbo.tb')
*/
--3.2.2 導入示例
--3.2.2.1 導入所有列
INSERT OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼',數據庫名.架構名.表名)
SELECT * FROM 本地表
/* 例如:INSERT OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)
SELECT * FROM tb
*/
--3.2.2.2 導入指定列
INSERT OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼',數據庫名.架構名.表名)(列,列...)
SELECT 列,列... FROM 本地表
/* 例如:INSERT OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)(RANGE,LEVEL,Persons)
SELECT RANGE,LEVEL,Persons FROM tb
*/
--注:更多替代方法參考.2.1查詢示例,只需替換行集函數(OPENROWSET)內的內容即可。
--3.2.3 更新示例
UPDATE OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼',數據庫名.架構名.表名)
SET 字段='值'
WHERE 字段='條件'
/*例如:UPDATE OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)
SET Persons='g'
WHERE Persons='a'
*/
--注:更多替代方法參考.2.1查詢示例,只需替換行集函數(OPENROWSET)內的內容即可。
--3.2.4 刪除示例
DELETE OPENROWSET('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼',數據庫名.架構名.表名)
WHERE 字段名='條件'
/*例如:DELETE OPENROWSET('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123',mydb.dbo.tb)
WHERE Persons='g'
*/
--注:更多替代方法參考.2.1查詢示例,只需替換行集函數(OPENROWSET)內的內容即可。
--3.3 OPENDATASOURCE方法(不需要用到創建好的鏈接名。如果連接的實例名不是默認的,需要在"sql服務器名或IP地址"后加上"/實例名")
--3.3.1 查詢示例
--3.3.1.1 Windows認證方式查詢(以下方法之一即可)
SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'server=sql服務器名或IP地址;Trusted_Connection=yes').數據庫名.架構名.表名
SELECT * FROM OPENDATASOURCE('SQLNCLI', 'server=sql服務器名或IP地址;Trusted_Connection=yes').數據庫名.架構名.表名
/* 例如:SELECT * FROM OPENDATASOURCE('SQLOLEDB','Server=192.168.58.208;Trusted_Connection=yes').Mydb.dbo.tb
或:SELECT * FROM OPENDATASOURCE('SQLNCLI','Server=192.168.58.208;Trusted_Connection=yes').Mydb.dbo.tb
*/
--3.3.1.2 SQL認證方式查詢(以下方法之一即可)
SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
SELECT * FROM OPENDATASOURCE('SQLNCLI', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
SELECT * FROM OPENDATASOURCE('SQLNCLI', 'Data Source=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
/* 例如:SELECT * FROM OPENDATASOURCE('SQLOLEDB','Server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
或:SELECT * FROM OPENDATASOURCE('SQLNCLI','Server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
或:SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
或:SELECT * FROM OPENDATASOURCE('SQLNCLI','Data source=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
*/
--3.3.2 導入示例
--3.3.2.1 導入所有列
INSERT OPENDATASOURCE('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
SELECT * FROM 本地表
/* 例如:INSERT OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
SELECT * FROM tb
*/
--3.3.2.2 導入指定列
INSERT OPENDATASOURCE('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名(列,列...)
SELECT 列,列... FROM 本地表
/* 例如:INSERT OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb(RANGE,LEVEL,Persons)
SELECT RANGE,LEVEL,Persons FROM tb
*/
--注:更多替代方法參考.3.1查詢示例,只需替換行集函數(OPENDATASOURCE)內的內容即可。
--3.3.3 更新示例
UPDATE OPENDATASOURCE('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
SET 字段='值'
WHERE 字段='條件'
/*例如:UPDATE OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
SET Persons='g'
WHERE Persons='a'
*/
--注:更多替代方法參考.3.1查詢示例,只需替換行集函數(OPENDATASOURCE)內的內容即可。
--3.3.4 刪除示例
DELETE OPENDATASOURCE('SQLOLEDB', 'server=sql服務器名或IP地址;uid=用戶名;pwd=密碼').數據庫名.架構名.表名
WHERE 字段名='條件'
/*例如:DELETE OPENDATASOURCE('SQLOLEDB','server=192.168.58.208;uid=sa;pwd=123').mydb.dbo.tb
WHERE Persons='g'
*/
--注:更多替代方法參考.3.1查詢示例,只需替換行集函數(OPENDATASOURCE)內的內容即可。
--4. 刪除鏈接服務器方法
--如果以后不再使用時可刪除鏈接信息
--4.1 刪除登錄信息(或叫刪除鏈接服務器登錄名映射)
EXEC sp_droplinkedsrvlogin 'LinkName',NULL
/*例如:EXEC sp_droplinkedsrvlogin 'TonyLink',NULL */
--4.2 刪除鏈接服務器名稱
EXEC sp_dropserver 'LinkName','droplogins' --如果指定droplogins,則在刪除鏈接服務器之前要刪除登錄名映射
/*例如:EXEC sp_dropserver 'TonyLink','droplogins' */
--附:獲取Provider Name的方法(EXEC master..xp_enum_oledb_providers)
SELECT CAST([Provider Name] AS VARCHAR(30)) ProviderName,
CAST([Provider Description] AS VARCHAR(60)) ProviderDescription
FROM OPENROWSET(
'SQLOLEDB',
'Server=.;Trusted_Connection=yes',
'SET FMTONLY OFF;
EXEC master..xp_enum_oledb_providers'
)
/*
ProviderName ProviderDescription
------------------------------ ------------------------------------------------------------
SQLOLEDB Microsoft OLE DB Provider for SQL Server
DTSPackageDSO Microsoft OLE DB Provider for DTS Packages
SQLReplication.OLEDB SQL Server Replication OLE DB Provider for DTS
MSOLAP Microsoft OLE DB Provider for Analysis Services 10.0
MSDMine Microsoft OLE DB Provider For Data Mining Services
Microsoft.ACE.OLEDB.12.0 Microsoft Office 12.0 Access Database Engine OLE DB Provider
ADsDSOObject OLE DB Provider for Microsoft Directory Services
SQLNCLI10 SQL Server Native Client 10.0
MSDAIPP.DSO Microsoft OLE DB Provider for Internet Publishing
MSDASQL Microsoft OLE DB Provider for ODBC Drivers
Microsoft.Jet.OLEDB.4.0 Microsoft Jet 4.0 OLE DB Provider
MSDAOSP Microsoft OLE DB Simple Provider
MSDAORA Microsoft OLE DB Provider for Oracle
MSIDXS Microsoft OLE DB Provider for Indexing Service
(14 行受影響)
*/
OpenRowSet相關幫助:
----------------------------------------------------------------------
包含訪問 OLE DB 數據源中的遠程數據所需的全部連接信息。當訪問鏈接服務器中的表時,這種方法是一種替代方法,並且是一種使用 OLE DB 連接並訪問遠程數據的一次性的臨時方法。對於較頻繁引用 OLE DB 數據源的情況,請改為使用鏈接服務器。有關詳細信息,請參閱 鏈接服務器。可以在查詢的 FROM 子句中像引用表名那樣引用 OPENROWSET 函數。依據 OLE DB 訪問接口的功能,還可以將 OPENROWSET 函數引用為 INSERT、UPDATE 或 DELETE 語句的目標表。盡管查詢可能返回多個結果集,但 OPENROWSET 只返回第一個結果集。
OPENROWSET 還通過內置的 BULK 訪問接口支持大容量操作,正是有了該訪問接口,才能從文件讀取數據並將數據作為行集返回。
Transact-SQL 語法約定
語法
OPENROWSET ( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' } , { [ catalog. ] [ schema. ] object | 'query' } | BULK 'data_file' , { FORMATFILE = 'format_file_path' [ <bulk_options> ] | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB } } ) <bulk_options> ::= [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] [ , ERRORFILE = 'file_name' ] [ , FIRSTROW = first_row ] [ , LASTROW = last_row ] [ , MAXERRORS = maximum_errors ] [ , ROWS_PER_BATCH = rows_per_batch ] |
- 參數
- ' provider_name '
-
字符串,表示在注冊表中指定的 OLE DB 訪問接口的友好名稱(或 PROGID)。provider_name 沒有默認值。
- ' datasource '
-
對應於特定 OLE DB 數據源的字符串常量。datasource 是要傳遞給訪問接口的 IDBProperties 接口的 DBPROP_INIT_DATASOURCE 屬性,該屬性用於初始化訪問接口。通常,該字符串包含數據庫文件的名稱、數據庫服務器的名稱,或者訪問接口能理解的用於定位數據庫的名稱。
- ' user_id '
-
字符串常量,它是傳遞給指定 OLE DB 訪問接口的用戶名。user_id 為連接指定安全上下文,並作為 DBPROP_AUTH_USERID 屬性傳入以初始化訪問接口。user_id 不能是 Microsoft Windows 登錄名稱。
- ' password '
-
字符串常量,它是傳遞給 OLE DB 訪問接口的用戶密碼。在初始化訪問接口時,password 作為 DBPROP_AUTH_PASSWORD 屬性傳入。password 不能是 Microsoft Windows 密碼。
- ' provider_string '
-
訪問接口特定的連接字符串,作為 DBPROP_INIT_PROVIDERSTRING 屬性傳入以初始化 OLE DB 訪問接口。通常 provider_string 封裝初始化訪問接口所需的所有連接信息。有關 SQL Server Native Client OLE DB 訪問接口可識別的關鍵字列表,請參閱Initialization and Authorization Properties。
- catalog
-
指定對象所在的目錄或數據庫的名稱。
- schema
-
架構的名稱或指定對象的對象所有者名稱。
- object
-
對象名,它唯一地標識出將要操作的對象。
- ' query '
-
字符串常量,發送到訪問接口並由訪問接口執行。SQL Server 的本地實例不處理該查詢,但處理由訪問接口返回的查詢結果(傳遞查詢)。有些訪問接口並不通過表名而是通過命令語言提供其表格格式數據,將傳遞查詢用於這些訪問接口是非常有用的。只要查詢訪問接口支持 OLE DB Command 對象及其強制接口,那么在遠程服務器上就支持傳遞查詢。有關詳細信息,請參閱 SQL Server Native Client (OLE DB) Reference。
- BULK
-
使用 OPENROWSET 的 BULK 行集訪問接口讀取文件中的數據。在 SQL Server 中,OPENROWSET 無需將數據文件中的數據加載到目標表,便可讀取這些數據。這樣便可在單個 SELECT 語句中使用 OPENROWSET。
BULK 選項的參數可對何時開始和結束數據讀取、如何處理錯誤以及如何解釋數據提供有效控制。例如,可以指定以類型為 varbinary、varchar 或 nvarchar 的單行單列行集的形式讀取數據文件。默認行為詳見隨后的參數說明。
有關如何使用 BULK 選項的信息,請參閱本主題后面部分的“備注”。有關 BULK 選項所需權限的信息,請參閱本主題后面的“權限”部分。
注意: 當用於以完整恢復模式導入數據時,OPENROWSET (BULK ...) 不優化日志記錄。 有關為大容量導入准備數據的信息,請參閱准備用於大容量導出或大容量導入的數據。
- ' data_file '
-
數據文件的完整路徑,該文件的數據將被復制到目標表中。
- FORMATFILE = ' format_file_path '
-
指定格式化文件的完整路徑。SQL Server 支持兩種格式化文件類型:XML 和非 XML。
格式化文件對定義結果集中的列類型是必需的。唯一的例外情況是指定 SINGLE_CLOB、SINGLE_BLOB 或 SINGLE_NCLOB 時;在這種情況下,不需要格式化文件。
有關格式化文件的信息,請參閱使用格式化文件大容量導入數據。
- < bulk_options>
-
指定 BULK 選項的一個或多個參數。
- CODEPAGE = { 'ACP '| 'OEM '| 'RAW '| ' code_page ' }
-
指定該數據文件中數據的代碼頁。僅當數據含有字符值大於 127 或小於 32 的 char、varchar 或 text 列時,CODEPAGE 才是適用的。
-
注意: 建議在格式化文件中為每個列指定一個排序規則名稱。 CODEPAGE 值 說明 ACP
將數據類型為 char、varchar 或 text 的列由 ANSI/Microsoft Windows 代碼頁 (ISO 1252) 轉換為 SQL Server 代碼頁。
OEM(默認值)
將數據類型為 char、varchar 或 text 的列由系統 OEM 代碼頁轉換為 SQL Server 代碼頁。
RAW
不執行從一個代碼頁到另一個代碼頁的轉換。這是執行最快的選項。
code_page
指示編碼數據文件中的字符數據所在的源代碼頁;例如,850。該代碼頁對 SQL Server 數據庫引擎正確解釋輸入數據是必需的。
- ERRORFILE = ' file_name '
-
指定用於收集格式有誤且不能轉換為 OLE DB 行集的行的文件。這些行將按原樣從數據文件復制到此錯誤文件中。
錯誤文件在開始執行命令時創建。如果該文件已存在,將引發一個錯誤。此外,還創建了一個擴展名為 .ERROR.txt 的控制文件。此文件引用錯誤文件中的每一行並提供錯誤診斷。糾正錯誤后即可加載數據。
- FIRSTROW = first_row
-
指定要加載的第一行的行號。默認值為 1,指示指定數據文件的第一行。通過對行終止符進行計數來確定行號。
- LASTROW = last_row
-
指定要加載的最后一行的行號。默認值為 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。
- ORDER ( { column [ ASC | DESC ] } [ ,... n ] [ UNIQUE ] )
-
一個用於指定數據文件中數據的排序方式的可選提示。默認情況下,大容量操作假定數據文件未排序。如果查詢優化器能夠利用指定順序來生成更有效的查詢計划,則性能可能會得到改善。指定一個排序可以取得益處的示例包括:
- 將行插入到具有聚集索引的表,其中行集數據按聚集索引鍵進行排序。
- 將行集與另一個表聯接,其中排序列和聯接列匹配。
- 通過排序列聚合行集數據。
- 將行集用作查詢的 FROM 子句中的源表,其中排序列和聯接列匹配。
UNIQUE 指定數據文件不能有重復條目。
如果數據文件中的實際行沒有根據指定的順序進行排序,或者如果指定了 UNIQUE 提示並且存在重復鍵,則返回錯誤。
使用 ORDER 時列別名是必需的。列別名列表必須引用由 BULK 子句正在訪問的派生表。在 ORDER 子句中指定的列名將引用此列別名列表。不能指定大值類型(varchar(max)、nvarchar(max)、varbinary(max) 和 xml)和大型對象 (LOB) 類型(text、ntext 和image)列。
- 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) 的單行單列行集返回。
備注
只有在以下情況下才能使用 OPENROWSET 訪問 OLE DB 數據源中的遠程數據:指定訪問接口的DisallowAdhocAccess 注冊表選項已顯式設置為 0,並啟用了 Ad Hoc Distributed Queries 高級配置選項。如果未設置這些選項,則默認行為不允許即席訪問。
訪問遠程 OLE DB 數據源時,服務器不會自動委托可信連接的登錄標識,客戶端通過此登錄標識才能連接到正在查詢的服務器。必須配置身份驗證委托。有關詳細信息,請參閱為委托配置鏈接服務器。
如果 OLE DB 訪問接口在指定的數據源中支持多個目錄和架構,那么就需要目錄及架構名稱。如果 OLE DB 訪問接口並不支持多個目錄和架構,那么可以忽略 catalog 和 schema 的值。如果訪問接口只支持架構名稱,那么必須指定一個格式為 schema.object 的兩部分名稱。如果訪問接口只支持目錄名稱,那么必須指定一個格式為catalog.schema.object 的三部分名稱。必須為使用 SQL Server Native Client OLE DB 訪問接口的傳遞查詢指定由三部分組成的名稱。有關詳細信息,請參閱 Transact-SQL 語法約定 (Transact-SQL)。
OPENROWSET 不接受參數變量。
使用帶有 BULK 選項的 OPENROWSET
以下 Transact-SQL 增強功能支持 OPENROWSET(BULK...)函數:
與 SELECT 一起使用的 FROM 子句可以調用 OPENROWSET(BULK...)而非表名,同時可以實現完整的 SELECT 功能。
帶有 BULK 選項的 OPENROWSET 在 FROM 子句中需要有一個相關名稱,也稱為范圍變量或別名。可以指定列別名。如果未指定列別名列表,則格式化文件必須具有列名。指定列別名會覆蓋格式化文件中的列名,例如:FROM OPENROWSET(BULK...) AS table_alias
FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)
SELECT...FROM OPENROWSET(BULK...)語句將直接查詢文件中的數據,無需將數據導入表中。SELECT…FROM OPENROWSET(BULK...)語句還可以通過使用格式化文件指定列名和數據類型,從而列出大容量列別名。
通過將 OPENROWSET(BULK...)用作 INSERT 或 MERGE 語句中的源表,將數據文件中的數據大容量導入 SQL Server 表中。有關詳細信息,請參閱使用 BULK INSERT 或 OPENROWSET(BULK...) 導入大容量數據。
OPENROWSET BULK 選項與 INSERT 語句一起使用時,BULK 子句支持表提示。BULK 子句除了接受 TABLOCK 等常規表提示之外,還可以接受下列專用表提示:IGNORE_CONSTRAINTS(僅忽略 CHECK 和 FOREIGN KEY 約束)、IGNORE_TRIGGERS、KEEPDEFAULTS 和 KEEPIDENTITY。有關詳細信息,請參閱表提示 (Transact-SQL)。
有關如何使用 INSERT...SELECT * FROM OPENROWSET(BULK...) 語句的信息,請參閱導入和導出大容量數據。有關何時在事務日志中記錄由大容量導入執行的行插入操作的信息,請參閱在大容量導入中按最小方式記錄日志的前提條件。
注意: |
---|
使用 OPENROWSET 時,請務必了解 SQL Server 是如何處理模擬的。有關安全注意事項的信息,請參閱使用 BULK INSERT 或 OPENROWSET(BULK...) 導入大容量數據。 |
大容量導出或導入 SQLXML 文檔
若要大容量導出或導入 SQLXML 數據,請在格式化文件中使用下列數據類型之一。
數據類型 | 效果 |
---|---|
SQLCHAR 或 SQLVARYCHAR |
在客戶端代碼頁或排序規則隱含的代碼頁中發送數據。 |
SQLNCHAR 或 SQLNVARCHAR |
以 Unicode 格式發送數據。 |
SQLBINARY 或 SQLVARYBIN |
不經任何轉換即發送數據。 |
權限
OPENROWSET 權限由傳遞給 OLE DB 訪問接口的用戶名的權限確定。若要使用 BULK 選項,則需要有 ADMINISTER BULK OPERATIONS 權限。
示例
A. 將 OPENROWSET 與 SELECT 和 SQL Server Native Client OLE DB 訪問接口一起使用
以下示例使用 SQL Server Native Client OLE DB 訪問接口訪問 HumanResources.Department
表,該表位於遠程服務器 Seattle1
上的 AdventureWorks
數據庫中。(使用 SQLNCLI 並且 SQL Server 將重定向到 SQL Server Native Client OLE DB 訪問接口的最新版本。)使用 SELECT
語句定義返回的行集。訪問接口字符串包含 Server
和 Trusted_Connection
關鍵字。這些關鍵字由 SQL Server Native Client OLE DB 訪問接口識別。
SELECT a.* FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;', 'SELECT GroupName, Name, DepartmentID FROM AdventureWorks.HumanResources.Department ORDER BY GroupName, Name') AS a; |
B. 使用 Microsoft OLE DB Provider for Jet
以下示例通過 Microsoft OLE DB Provider for Jet 訪問 Microsoft Access Northwind
數據庫中的 Customers
表。
注意: |
---|
該示例假定已經安裝了 Access。若要運行該示例,則必須安裝 Northwind 數據庫。有關如何安裝 Northwind數據庫的詳細信息,請參閱下載 Northwind 和 pubs 示例數據庫。 |
SELECT CustomerID, CompanyName FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:/Program Files/Microsoft Office/OFFICE11/SAMPLES/Northwind.mdb'; 'admin';'',Customers) GO |
C. 使用 OPENROWSET 和 INNER JOIN 中的另一個表
以下示例從 SQL Server Northwind
數據庫的本地實例中的 Customers
表以及存儲在同一計算機上的 AccessNorthwind
數據庫中的 Orders
表選擇所有數據。
注意: |
---|
該示例假定已經安裝了 Access。若要運行該示例,則必須安裝 Northwind 數據庫。有關如何安裝 Northwind數據庫的詳細信息,請參閱下載 Northwind 和 pubs 示例數據庫。 |
USE Northwind GO SELECT c.*, o.* FROM Northwind.dbo.Customers AS c INNER JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'C:/Program Files/Microsoft Office/OFFICE11/SAMPLES/Northwind.mdb';'admin';'', Orders) AS o ON c.CustomerID = o.CustomerID GO |
D. 使用 OPENROWSET 將文件數據大容量插入 varbinary(max) 列中
以下示例創建一個用於演示的小型表,並將名為 Text1.txt
的文件(位於 C:
根目錄)中的文件數據插入varbinary(max)
列中。
USE AdventureWorks GO CREATE TABLE myTable(FileName nvarchar(60), FileType nvarchar(60), Document varbinary(max)) GO INSERT INTO myTable(FileName, FileType, Document) SELECT 'Text1.txt' AS FileName, '.txt' AS FileType, * FROM OPENROWSET(BULK N'C:/Text1.txt', SINGLE_BLOB) AS Document GO |
E. 將 OPENROWSET BULK 訪問接口用於格式化文件以檢索文本文件中的行
以下示例使用格式化文件檢索用制表符分隔的文本文件 values.txt
中的行,該文件包含下列數據:
1 Data Item 1 2 Data Item 2 3 Data Item 3 |
格式化文件 values.fmt
說明 values.txt
中的列:
9.0 2 1 SQLCHAR 0 10 "/t" 1 ID SQL_Latin1_General_Cp437_BIN 2 SQLCHAR 0 40 "/r/n" 2 Description SQL_Latin1_General_Cp437_BIN |
下面的語句是檢索此數據的查詢:
SELECT a.* FROM OPENROWSET( BULK 'c:/test/values.txt', FORMATFILE = 'c:/test/values.fmt') AS a; |
--------------------------------------------------------------------
語法
OPENDATASOURCE ( provider_name, init_string ) |
參數
- provider_name
-
注冊為用於訪問數據源的 OLE DB 訪問接口的 PROGID 的名稱。provider_name 的數據類型為 char,無默認值。
- init_string
-
連接字符串,該字符串將要傳遞給目標提供程序的 IDataInitialize 接口。提供程序字符串語法是以關鍵字值對為基礎的,這些關鍵字值對由分號隔開,例如:“keyword1=value; keyword2=value”。
若要了解提供程序上支持的特定關鍵字值對,請參閱 Microsoft Data Access SDK。該文檔定義了基本語法。下表列出了 init_string 參數中最常用的關鍵字。
關鍵字 OLE DB 屬性 有效值和說明 數據源
DBPROP_INIT_DATASOURCE
要連接的數據源的名稱。不同的提供程序用不同的方法對此進行解釋。對於 SQL Server Native Client OLE DB 訪問接口,這指示服務器的名稱。對於 Jet OLE DB 訪問接口來說,這指示 .mdb 文件或 .xls 文件的完整路徑。
位置
DBPROP_INIT_LOCATION
要連接的數據庫的位置。
擴展屬性
DBPROP_INIT_PROVIDERSTRING
提供程序特定的連接字符串。
連接超時
DBPROP_INIT_TIMEOUT
達到該超時值后,連接嘗試將失敗。
用戶 ID
DBPROP_AUTH_USERID
用於該連接的用戶 ID。
密碼
DBPROP_AUTH_PASSWORD
用於該連接的密碼。
目錄
DBPROP_INIT_CATALOG
連接到數據源時的初始或默認的目錄名稱。
集成安全性
DBPROP_AUTH_INTEGRATED
SSPI,指定 Windows 身份驗證
備注
僅當 DisallowAdhocAccess 注冊表選項針對指定的提供程序顯式設置為 0,並且啟用 Ad Hoc Distributed Queries 高級配置選項時,OPENDATASOURCE 才可用於訪問 OLE DB 數據源中的遠程數據。如果未設置這些選項,則默認行為不允許即席訪問。
OPENDATASOURCE 函數可以在能夠使用鏈接服務器名的相同 Transact-SQL 語法位置中使用。因此,可以將 OPENDATASOURCE 用作四部分名稱的第一部分,該部分名稱引用 SELECT、INSERT、UPDATE 或 DELETE 語句中的表或視圖的名稱;或者引用 EXECUTE 語句中的遠程存儲過程。當執行遠程存儲過程時,OPENDATASOURCE 應該引用 SQL Server 的另一個實例。OPENDATASOURCE 不接受參數變量。
與 OPENROWSET 函數類似,OPENDATASOURCE 應該只引用那些不經常訪問的 OLE DB 數據源。對於訪問次數較頻繁的任何數據源,請為它們定義鏈接服務器。無論 OPENDATASOURCE 還是 OPENROWSET 都不能提供鏈接服務器定義的全部功能,例如,安全管理以及查詢目錄信息的功能。每次調用 OPENDATASOURCE 時,都必須提供所有的連接信息(包括密碼)。
重要提示: |
---|
Windows 身份驗證比 SQL Server 身份驗證要安全得多。應盡量使用 Windows 身份驗證。OPENDATASOURCE 不應該用於連接字符串中的顯式密碼。 |
權限
任何用戶都可以執行 OPENDATASOURCE。用於連接到遠程服務器的權限由連接字符串確定。
示例
以下示例將創建與服務器 London
上的 SQL Server 實例 Payroll
的即席連接,並查詢AdventureWorks.HumanResources.Employee
表。(使用 SQLNCLI 並且 SQL Server 將重定向到 SQL Server Native Client OLE DB 訪問接口的最新版本。)
SELECT * FROM OPENDATASOURCE('SQLNCLI', 'Data Source=London/Payroll;Integrated Security=SSPI') .AdventureWorks.HumanResources.Employee |
OpenQuery相關幫助:
-------------------------------------------------------------------
對給定的鏈接服務器執行指定的傳遞查詢。該服務器是 OLE DB 數據源。OPENQUERY 可以在查詢的 FROM 子句中引用,就好象它是一個表名。OPENQUERY 也可以作為 INSERT、UPDATE 或 DELETE 語句的目標表進行引用。但這要取決於 OLE DB 訪問接口的功能。盡管查詢可能返回多個結果集,但是 OPENQUERY 只返回第一個。
語法
OPENQUERY ( linked_server ,'query' ) |
參數
- linked_server
-
表示鏈接服務器名稱的標識符。
- ' query '
-
在鏈接服務器中執行的查詢字符串。該字符串的最大長度為 8 KB。
備注
OPENQUERY 不接受其參數的變量。
在 SQL Server 2000 和更高版本中,OPENQUERY 不能用於對鏈接服務器執行擴展存儲過程。但是,通過使用四部分名稱,可以在鏈接服務器上執行擴展存儲過程。例如:
EXEC SeattleSales.master.dbo.xp_msver |
權限
任何用戶都可以執行 OPENQUERY。用於連接到遠程服務器的權限是從為鏈接服務器定義的設置中獲取的。
示例
A. 執行 SELECT 傳遞查詢
以下示例將使用“用於 Oracle 的 Microsoft 訪問接口”針對 Oracle 數據庫創建一個名為 OracleSvr
的鏈接服務器。然后,該示例針對此鏈接服務器使用 SELECT
傳遞查詢。
注意: | ||
---|---|---|
本示例假定已經創建了一個名為 ORCLDB 的 Oracle 數據庫別名。
|
B. 執行 UPDATE 傳遞查詢
以下示例針對示例 A 中創建的鏈接服務器使用 UPDATE
傳遞查詢。
UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') SET name = 'ADifferentName'; |
C. 執行 INSERT 傳遞查詢
以下示例針對示例 A 中創建的鏈接服務器使用 INSERT
傳遞查詢。
INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles') VALUES ('NewTitle'); |
D. 執行 DELETE 傳遞查詢
以下示例使用 DELETE
傳遞查詢刪除示例 C 中插入的行。
DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle'''); |