クロスデータベースクエリのSQL Serverのデータの方法

需要

二つの対応サーバーSQL Serverデータベースサービス、クエリデータに関連する二つのテーブル。

単一テーブルのクエリ

ライブラリ名テーブル.dbo OPENDATASOURCE( 'SQLOLEDB'、 'パスワード=パスワード;ユーザーID = saのデータソース=遠隔実際の列名')から*を選択します。 

例えば:

選択* OPENDATASOURCEから( 'SQLOLEDB'、 'データソース= 192.168.1.131;ユーザID =寺;パスワード= 123456')。BaoGuang_QrCode.dbo.T_BC_BaseInfo

クエリに関連したマルチテーブル(以下、サーバ名は、気軽にシャウトを書かれています)

OPENROWSET SELECT * FROM( 'SQLOLEDB'、 '192.168.1.128'; 'SA'; 'ele3561424'、EleList.dbo.barCode)Aが
OPENROWSET( 'SQLOLEDB'、 '192.168.1.131'をJOIN、 'SA'、 '123456' 、BaoGuang_QrCode.dbo.T_BC_BaseInfo)B
ON A.BarCode = B.BarCode
WHERE A.createDate> '2019年12月31日00:00:00'

 

OPENROWSET SELECT * FROM( 'SQLOLEDB'、 '192.168.10.28'; 'SA'; 'ele3561424'、EleList.dbo.barCode)D
ここD.BarCodeない(で
OPENROWSET FROM SELECT A.BarCode( 'SQLOLEDB'、 '192.168 .10.28 ';' SA ';' ele3561424' 、EleList.dbo.barCode)A
SQLOLEDB '、 '192.168.10.168 OPENROWSETを(JOIN'、 'SA'; '123qwe'、BaoGuang_QrCode.dbo.T_BC_BaseInfo)B
A. ONバーコード= B.BarCode
A.createDate> '2019年12月31日00:00:00')
とD.createDate> '2019年12月31日00:00:00'
'%2001パーセント'のようなとD.BarCode

 
 

OPENDATASOURCEは
4部とオブジェクト名の一部として、サーバー名をリンクし、特定の接続情報を提供していません。

構文
OPENDATASOURCE(PROVIDER_NAME、init_stringは)

パラメータ
PROVIDER_NAME

データソースにアクセスするためのOLE DB用PROGID名登録者。文字のPROVIDER_NAMEデータ型、デフォルト値はありません。

INIT_STRING

アプリケーションインタフェースに渡される文字列の接続はをIDataInitializeターゲットを提供します。プロバイダ文字列の構文は、これらのキーワードと値のペアは、例えば、セミコロンで区切られたベースキーワードと値のペアである:「KEYWORD1 =値; KEYWORD2 =値」。

マイクロソフトでは?データアクセスSDKは、基本的な構文を定義します。サポートされている情報の特定のキーワードと値のペアは、プロバイダのマニュアルを参照してください。次の表は、最も一般的に使用されるパラメータは、キーワードをinit_stringは。

OLE DB有効な値とキーワードの記述
に接続するデータソース名DBPROP_INIT_DATASOURCEデータソース。異なるプロバイダは、さまざまな方法でこれを解釈します。SQL ServerのOLE DBプロバイダの場合は、サーバーの名前を示します。ジェットOLE DBプロバイダの場合は、.MDBファイルまたは.xlsファイルへのフルパスを指定します。
あなたは、データベースに接続したいDBPROP_INIT_LOCATION位置。
プロバイダ固有の接続文字列をDBPROP_INIT_PROVIDERSTRING属性を拡張しました。
接続タイムアウトDBPROP_INIT_TIMEOUTのタイムアウト値は、タイムアウト値の後に、接続の試みは失敗します。
接続用のユーザーIDのDBPROP_AUTH_USERIDユーザーID。
接続用のパスワードDBPROP_AUTH_PASSWORDパスワード。
ディレクトリDBPROP_INIT_CATALOGは、初期またはデフォルトのディレクトリ名データソースに接続されています。



OPENDATASOURCE関数はでリンクサーバー名を使用するには、同じTransact-SQLの構文位置を使用することができます。これにより、第一の部分OPENDATASOURCE 4つの部分の名称として使用することができ、名前はSELECT、INSERT、UPDATEまたはDELETEステートメントの表またはビューの名前を指し;またはEXECUTEステートメントリモートストアドプロシージャを指します。リモートストアドプロシージャを実行する場合、OPENDATASOURCEは別のSQL Serverを参照してください。OPENDATASOURCEは、引数の変数を受け付けません。

同様のOPENROWSET関数、OPENDATASOURCEは、頻繁にアクセスされていないOLE DBデータソースを参照する必要があります。もう少しアクセスされたデータソースの任意の数のために、彼らがサーバーをリンク定義してください。かどうかOPENDATASOURCEやOPENROWSETは、サーバー定義、例えば、セキュリティ管理、およびクエリカタログ情報への能力の完全な機能へのリンクを提供します。たびOPENDATASOURCEコールが、それは(パスワードを含む)の接続情報のすべてを提供しなければなりません。

例えば
テーブルから次の例でアクセスデータは、SQL Serverの別のインスタンスのテーブル。

SELECT *
OPENDATASOURCE(FROM
          'SQLOLEDB'、
          ';;ユーザーID = MyUIDパスワード= MYPASSデータソース=サーバー名'
          .Northwind.dbo.Categories)

以下は、Jet OLE DBによってためのプログラムクエリExcelスプレッドシートを提供し、サンプルクエリです。

SELECT *
OpenDataSourceをFROM( 'Microsoft.Jet.OLEDB.4.0'、
   'データソース= "C:/Finance/account.xls";ユーザーID =管理者;パスワード=;拡張プロパティ= Excel 5.0の')... xactions

OPENROWSETは、
リモート・データ・アクセスOLE DBデータ・ソースに必要なすべての接続情報が含まれています。リンクサーバーのテーブルにアクセスする場合、使い捨て、特別な方法は、この方法は、別の方法、およびリモートデータへのOLE DB接続とアクセスを使用しています。OPENROWSET関数は、クエリのFROM句で参照としてテーブル名として参照することができます。能力OLE DBプロバイダに基づいて、OPENROWSET関数は、ターゲット表のINSERT、UPDATE、またはDELETEステートメントとして参照することができます。クエリが複数の結果セットを返すことができるが、しかし、OPENROWSETは、最初のものを返します。

语法
OPENROWSET( 'PROVIDER_NAME'
     、{ 'データソース'; 'USER_ID'; 'パスワードを'
         | 'provider_string'}
     、{[カタログ] [スキーマ]オブジェクト
         | 'クエリ'}
     )

参数
'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' 是字符串常量,发送到提供程序并由提供程序执行。Microsoft? SQL Server? 不处理该查询,但处理由提供程序返回的查询结果(直接传递查询)。对于有些提供程序,它们并没有通过表名而是通过命令语言表现自己的表格格式数据,那么将直接传递查询用于这些提供程序是非常有用的。只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持直接传递查询。有关更多信息,请参见 SQL Server OLE DB 程序员参考。

注释
如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构,那么可以省略 catalog 及 schema 的值。

如果提供程序只支持架构名,那么必须指定一个两部分名称,形式为 schema.object。如果提供程序只支持目录名,那么必须指定一个三部分名称,形式为 catalog.schema.object。

OPENROWSET 不接受参数变量。

权限
OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。

示例
A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用
下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。从 datasource、user_id 及 password 中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
    'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO

B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用
下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化,定义返回的行集时使用 catalog.schema.object 语法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
    'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
    pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO

C. 使用用于 Jet 的 Microsoft OLE DB 提供程序
下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。

说明   下面的示例假定已经安装了 Access。
USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'c:/MSOffice/Access/Samples/northwind.mdb';'admin';'mypwd', Orders)
    AS a
GO

D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表
下面的示例从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据

说明   下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN
    OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'c:/MSOffice/Access/Samples/northwind.mdb';'admin';'mypwd', Orders)
    AS o
    ON c.CustomerID = o.CustomerID
GO

上面两个方法的示例:
[OpenDataSource]
    1.
     Select * from OpenDataSource('SQLOLEDB','Data Source=ServerName;User ID=MyID;Password=MyPass').DBName.DBO.TableName
    2.通过用Jet的OLEDB提供程序查询Excel电子表格
     Select * from OpenDataSource('MICROSOFT.JET.OLEDB.4.0','Data Source="c:/account.xls";User ID=Admin;Password=;Extended Properties=Excel 5.0')...Xactions

[OpenRowSet]
    格式:
      OpenRowSet('Provider_Name','{'DataSource';'UserID';'Password'|'Provider_String'},{[CateLog.][Schema.]Object|'Query'})
    1.
     Select A.* from OpenRowSet('SQLOLEDB','ServerName';'UserID';'Password','Select * from pubs.dbo.authors',Orders) as A
    
    2.
     Select A.* from OperRowset('MSDASQL','DRIVER={SQL Server};Server=ServerName;UID=UserID;PWD=MyPass',pus.dbo.Authors) as A
   
    3.Select A.* from OperRowSet('MICROSOFT.JET.OLEDB.4.0','c:/access/northowind.mdb';'UserID';'Password',Orders) AS A
   
    4.Select C.* ,O.* from Northowind.dbo.customers   c
     inner join OpenRowSet('MICROSOFT.JET.OLEDB.4.0','c:/access/northowind.mdb';'Admin';'MyPass',Orders) as o
     on c.CustomerID = o.CustomerID
   
    5.Select * From OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 5.0;HDR=YES;IMEX=2;DataBase=D:/Book1.XLS',[sheet1$])

需求

两个服务器上对应的SQL Server数据库服务,关联两张表查询数据。

单表查询

select * from OPENDATASOURCE('SQLOLEDB','Data Source=远程实列名;User ID=sa;Password=密码').库名.dbo.表名 

例如:

select * from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.1.131;User ID=sa;Password=123456').BaoGuang_QrCode.dbo.T_BC_BaseInfo

多表关联查询(下列服务器名是随便写的吆)

SELECT * FROM OPENROWSET('SQLOLEDB','192.168.1.128';'sa';'ele3561424',EleList.dbo.barCode) A
JOIN OPENROWSET('SQLOLEDB','192.168.1.131';'sa';'123456',BaoGuang_QrCode.dbo.T_BC_BaseInfo) B
ON A.BarCode = B.BarCode
WHERE A.createDate>'2019-12-31 00:00:00'

 

select * from OPENROWSET('SQLOLEDB','192.168.10.28';'sa';'ele3561424',EleList.dbo.barCode) D
where D.BarCode not in (
SELECT A.BarCode FROM OPENROWSET('SQLOLEDB','192.168.10.28';'sa';'ele3561424',EleList.dbo.barCode) A
JOIN OPENROWSET('SQLOLEDB','192.168.10.168';'sa';'123qwe',BaoGuang_QrCode.dbo.T_BC_BaseInfo) B
ON A.BarCode = B.BarCode
WHERE A.createDate>'2019-12-31 00:00:00')
and D.createDate>'2019-12-31 00:00:00'
and D.BarCode like'%2001%'

おすすめ

転載: www.cnblogs.com/qqhfeng/p/12619799.html