Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

2 façons de créer une table sur un serveur lié à l'aide de T-SQL

Si vous devez créer une table sur un serveur lié, vous pouvez le faire soit directement sur le serveur distant, soit en exécutant un script depuis votre serveur local.

Voici deux manières d'utiliser T-SQL pour créer une table sur un serveur lié.

Les deux méthodes utilisent le EXECUTE /EXEC déclaration. Mais chacun utilise une approche différente.

Prérequis

L'exécution de procédures stockées sur un serveur lié nécessite que vous activiez RPC Out (si ce n'est déjà fait).

Vous pouvez vérifier si RPC Out est activé en interrogeant sys.servers vue du catalogue.

Le code suivant active RPC Out sur un serveur lié appelé Homer :

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

Avec RPC Out activé, nous pouvons continuer et créer les tables.

Méthode 1

Notre première approche consiste à utiliser le AT argument pour spécifier un serveur lié pour lequel exécuter le code. Cette syntaxe nous permet d'envoyer des commandes directes aux serveurs liés.

Ça se passe comme ça :

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

Cela crée une table appelée Cats dans les Pets base de données sur le serveur lié appelé Homer .

Ce code suppose évidemment qu'il existe une base de données appelée Pets sur le serveur lié. S'il n'y en a pas, vous devrez d'abord le créer.

Le nom du serveur lié (Homer dans ce cas) est une définition de serveur lié existante dans le serveur local. Ce n'est pas le nom du serveur distant réel.

Méthode 2

Notre deuxième approche consiste à exécuter le sp_executesql procédure stockée système sur le serveur distant, tout en transmettant notre instruction T-SQL.

Comme ceci :

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

Ainsi, même si la syntaxe est différente, le résultat est le même. De plus, le CREATE TABLE la syntaxe ne change pas, quelle que soit la méthode utilisée pour accéder au serveur lié.

Transmettre l'instruction en tant que variable

Vous pouvez également passer le CREATE TABLE instruction en tant que variable dans EXEC déclaration.

Cela peut être utile si vous avez beaucoup de tableaux et/ou d'autres objets à créer.

Voici un exemple utilisant la première syntaxe :

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;

Et voici l'équivalent en utilisant la seconde syntaxe :

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;