Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

2 Möglichkeiten zum Erstellen einer Tabelle auf einem Verbindungsserver mit T-SQL

Wenn Sie eine Tabelle auf einem Verbindungsserver erstellen müssen, können Sie dies entweder direkt auf dem Remote-Server tun oder indem Sie ein Skript von Ihrem lokalen Server ausführen.

Hier sind zwei Möglichkeiten, T-SQL zu verwenden, um eine Tabelle auf einem Verbindungsserver zu erstellen.

Beide Methoden verwenden das EXECUTE /EXEC Erklärung. Aber jeder verwendet einen anderen Ansatz.

Voraussetzung

Das Ausführen gespeicherter Prozeduren auf einem Verbindungsserver erfordert, dass Sie RPC Out aktivieren (falls es nicht bereits aktiviert ist).

Sie können überprüfen, ob RPC Out aktiviert ist, indem Sie sys.servers abfragen Katalogansicht.

Der folgende Code aktiviert RPC Out auf einem Verbindungsserver namens Homer :

EXEC sp_serveroption 'MyLinkedServer', 'rpc out', 'true';

Wenn RPC Out aktiviert ist, können wir fortfahren und die Tabellen erstellen.

Methode 1

Unser erster Ansatz ist die Verwendung des AT -Argument, um einen Verbindungsserver anzugeben, für den der Code ausgeführt werden soll. Diese Syntax ermöglicht es uns, Pass-Through-Befehle an verbundene Server zu senden.

Das geht so:

EXEC ('
    USE  [Pets];
    CREATE TABLE [dbo].[Cats](
        [CatId] [int] IDENTITY(1,1) NOT NULL,
        [CatName] [varchar](60) NULL
    ) ON [PRIMARY];
') AT Homer;

Dadurch wird eine Tabelle namens Cats erstellt in den Pets Datenbank auf dem Verbindungsserver namens Homer .

Dieser Code geht offensichtlich davon aus, dass es eine Datenbank namens Pets gibt auf dem verlinkten Server. Wenn dies nicht der Fall ist, müssen Sie es zuerst erstellen.

Der Name des verknüpften Servers (Homer in diesem Fall) ist eine vorhandene Verbindungsserverdefinition auf dem lokalen Server. Es ist nicht der Name des eigentlichen Remote-Servers.

Methode 2

Unser zweiter Ansatz besteht darin, sp_executesql auszuführen gespeicherte Systemprozedur auf dem Remote-Server, während unsere T-SQL-Anweisung übergeben wird.

So:

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];
    ';

Obwohl die Syntax unterschiedlich ist, ist das Ergebnis dasselbe. Plus die CREATE TABLE Syntax ändert sich nicht, unabhängig von der Methode, die für den Zugriff auf den Verbindungsserver verwendet wird.

Übergeben Sie die Anweisung als Variable

Sie können auch CREATE TABLE übergeben -Anweisung als Variable an EXEC Erklärung.

Dies kann nützlich sein, wenn Sie viele Tabellen und/oder andere Objekte erstellen müssen.

Hier ist ein Beispiel mit der ersten Syntax:

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;

Und hier ist das Äquivalent mit der zweiten Syntax:

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;