---------------------------------------------------------------------------------- -- Author : htl258(Tony) -- Date : 2010-06-25 22:23:18 -- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) -- Jul 9 2008 14:43:34 -- Copyright (c) 1988-2008 Microsoft Corporation -- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2) -- Blog : http://blog.csdn.net/htl258(轉載保留此信息) -- Subject: SQL不一樣服務器數據庫之間數據操做整理 ---------------------------------------------------------------------------------- --1. 建立連接服務器 --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 ] [ , ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) [ UNIQUE ] 參數 ' 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相關幫助: -------------------------------------------------------------------- 不使用連接服務器的名稱,而提供特殊的鏈接信息,並將其做爲四部分對象名的一部分。 語法 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 數據庫別名。 EXEC sp_addlinkedserver 'OracleSvr', 'Oracle 7.3', 'MSDAORA', 'ORCLDB' GO SELECT * FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') GO 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'''); -----------------------------------------------------------------------