SQL Server Native Client OLE DB プロバイダー

Microsoft SQL Server Native Client OLE DB プロバイダーには、Microsoft SQL Server データベースに対する OLE DB インターフェイスが用意されています。SQL Server 分散クエリでは、SQL Server Native Client OLE DB プロバイダーを使用することにより、SQL Server のリモート インスタンスのデータにクエリを実行できます。

SQL Server データベースにアクセスするリンク サーバーを作成するには

  • SQL Server のリモート インスタンスを data_source として実行しているサーバーのネットワーク名を指定して sp_addlinkedserver を実行し、リンク サーバーを作成します。SQL Server リンク サーバーの場合は、プロバイダー (SQLNCLI) の指定を省略できます (SQLNCLI を使用すると、SQL Server により最新バージョンの SQL Server Native Client OLE DB プロバイダーにリダイレクトされます)。

    たとえば、ネットワーク名が NetSQLSrvr というサーバー上で実行される SQL Server のインスタンスに対して動作する LinkSQLSrvr というリンク サーバーを作成するには、次のいずれかを実行します。

    sp_addlinkedserver N'LinkSQLSrvr', ' ', N'SQLNCLI', N'NetSQLSrvr'
    sp_addlinkedserver N'LinkSQLSrvr', ' ', ' ', N'NetSQLSrvr'
    

    または、次の例で示すように、SQL Server リンク サーバーをそのネットワーク名として定義できます。

    sp_addlinkedserver N'NetSQLSrvr'
    

SQL Server 2000 のインスタンスを実行するサーバーに対して分散クエリを実行する場合は、SQL Server 2000 Service Pack 4 (SP4) を適用することをお勧めします。SP4 を適用していない場合は、SP4 に含まれる Instcat.sql スクリプトを実行して、カタログ ストアド プロシージャをアップグレードする必要があります。

SQL Server Version 7.0 以前を実行しているサーバーに対して分散クエリを実行する場合、分散クエリが適切に動作するためには、旧バージョンのカタログ ストアド プロシージャをアップグレードする必要があります。たとえば、サーバーが SQL Server 7.0 のインスタンスを実行している場合は、サーバー上のカタログ ストアド プロシージャを SQL Server 2008 にアップグレードしてから、SQL Server 2008 のインスタンスを実行するサーバーからの分散クエリで参照する必要があります。

リモート SQL Server テーブルを更新すると、ローカル サーバーまたはクライアントはその更新に対して起動されたトリガーから生じる結果セットやメッセージを受け取りません。

4 つの部分で構成された名前を使用する場合は、常にスキーマ名を指定してください。分散クエリでスキーマ名を指定しないと、OLE DB はテーブルを見つけることができません。ローカル テーブルを参照する場合、SQL Server は所有者名が指定されていなければ既定値を使用します。次の SELECT ステートメントは 7314 エラーを生成し、仮にリンク サーバー ログインがリンク サーバー上の AdventureWorks2008R2 データベース内の dbo ユーザーにマップされていてもエラーになります。

sp_addlinkedserver @server = N'LinkServer',
    @srvproduct = N' ',
    @provider = N'SQLNCLI', 
    @datasrc = N'ServerNetName', 
    @catalog = N'AdventureWorks2008R2'
GO
SELECT *
FROM LinkServer.AdventureWorks2008R2.dbo.Vendor

次の例では、リンク サーバーとリモート サーバーの両方を othersite というネットワーク名の同じコンピューターにアクセスするように定義しています。リンク サーバー定義ではリモート サーバーのネットワーク名と同じ名前を使用しますが、リモート サーバー定義では別の名前を使用しています。

/* Create a linked server definition to othersite. */
EXEC sp_addlinkedserver 'othersite', N'SQL Server'

/* Create a remote server definition using a
   fictitious name. */
EXEC sp_addserver 'RPCothersite'

/* Set the fictitious name to the network name far away. */
EXEC sp_setnetname 'RPCothersite', 'othersite'

これらの名前は、分散クエリまたはリモート プロシージャ コール内で参照できます。

/* A distributed query referencing othersite. */
SELECT *
FROM othersite.Northwind.dbo.Employees
/* A remote procedure call to the same server. */
EXEC RPCothersite.master.dbo.sp_who
/* Distributed queries can be used to execute
   stored procedures on the other server. */
EXEC othersite.master.dbo.sp_who

リンク サーバーとリモート サーバーでは、実行されるストアド プロシージャのログイン マッピング メカニズムに相違があります。詳細については、「サーバーのリンク」を参照してください。

分散クエリでのトランザクションに関する注意点

Microsoft SQL Server Native Client OLE DB プロバイダーでは、入れ子になったトランザクションはサポートされません。このため、複数の Transact-SQL ステートメントに関係するトランザクション内のデータ変更処理、および分散パーティション ビューに対するデータ変更処理では、XACT_ABORT を ON に設定する必要があります。