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;