リンクサーバー上にテーブルを作成する必要がある場合は、リモートサーバー上で直接作成するか、ローカルサーバーからスクリプトを実行して作成できます。
T-SQLを使用してリンクサーバー上にテーブルを作成する2つの方法を次に示します。
どちらの方法もEXECUTE
を使用します / EXEC
声明。ただし、それぞれ異なるアプローチを使用しています。
前提条件
リンクサーバーでストアドプロシージャを実行するには、RPC Outを有効にする必要があります(まだ有効になっていない場合)。
sys.servers
にクエリを実行すると、RPCOutが有効になっているかどうかを確認できます。 カタログビュー。
次のコードは、Homer
と呼ばれるリンクサーバーでRPCOutを有効にします :
EXEC sp_serveroption 'MyLinkedServer', 'rpc out', 'true';
RPC Outを有効にすると、先に進んでテーブルを作成できます。
方法1
最初のアプローチは、AT
を使用することです コードを実行するリンクサーバーを指定する引数。この構文により、リンクされたサーバーにパススルーコマンドを送信できます。
次のようになります:
EXEC ('
USE [Pets];
CREATE TABLE [dbo].[Cats](
[CatId] [int] IDENTITY(1,1) NOT NULL,
[CatName] [varchar](60) NULL
) ON [PRIMARY];
') AT Homer;
これにより、Cats
というテーブルが作成されます Pets
で Homer
と呼ばれるリンクサーバー上のデータベース 。
このコードは明らかに、Pets
というデータベースがあることを前提としています。 リンクサーバー上。ない場合は、最初に作成する必要があります。
リンクされたサーバー名(Homer
この場合)は、ローカルサーバー内の既存のリンクサーバー定義です。実際のリモートサーバーの名前ではありません。
方法2
2番目のアプローチは、sp_executesql
を実行することです。 T-SQLステートメントを渡しながら、リモートサーバー上のシステムストアドプロシージャ。
このように:
EXEC Homer.master.dbo.sp_executesql N'
USE [Pets];
CREATE TABLE [dbo].[Dogs](
[DogId] [int] IDENTITY(1,1) NOT NULL,
[DogName] [nvarchar](255) NULL,
[GoodDog] [bit] NULL
) ON [PRIMARY];
';
したがって、構文が異なっていても、結果は同じです。さらに、CREATE TABLE
リンクサーバーへのアクセス方法に関係なく、構文は変更されません。
ステートメントを変数として渡す
CREATE TABLE
を渡すこともできます EXEC
への変数としてのステートメント ステートメント。
これは、作成するテーブルやその他のオブジェクトがたくさんある場合に便利です。
最初の構文を使用した例を次に示します。
DECLARE @tsql nvarchar(max);
SET @tsql = '
USE [Pets];
CREATE TABLE [dbo].[Cats](
[CatId] [int] IDENTITY(1,1) NOT NULL,
[CatName] [varchar](60) NULL
) ON [PRIMARY];
CREATE TABLE [dbo].[Dogs](
[DogId] [int] IDENTITY(1,1) NOT NULL,
[DogName] [nvarchar](255) NULL,
[GoodDog] [bit] NULL
) ON [PRIMARY];
';
EXEC (@tsql) AT Homer;
そして、これは2番目の構文を使用した同等のものです:
DECLARE @tsql nvarchar(max);
SET @tsql = '
USE [Pets];
CREATE TABLE [dbo].[Cats](
[CatId] [int] IDENTITY(1,1) NOT NULL,
[CatName] [varchar](60) NULL
) ON [PRIMARY];
CREATE TABLE [dbo].[Dogs](
[DogId] [int] IDENTITY(1,1) NOT NULL,
[DogName] [nvarchar](255) NULL,
[GoodDog] [bit] NULL
) ON [PRIMARY];
';
EXEC Homer.master.dbo.sp_executesql @tsql;