Ако трябва да създадете таблица на свързан сървър, можете да направите това или директно на отдалечения сървър, или можете да го направите, като изпълните скрипт от вашия локален сървър.
Ето два начина за използване на T-SQL за създаване на таблица на свързан сървър.
И двата метода използват EXECUTE
/EXEC
изявление. Но всеки използва различен подход.
Предварително условие
Изпълнението на съхранени процедури на свързан сървър изисква да активирате RPC Out (ако вече не е активиран).
Можете да проверите дали RPC Out е активиран, като потърсите sys.servers
изглед на каталог.
Следният код активира RPC Out на свързан сървър, наречен Homer
:
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
Вторият ни подход е да изпълним 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;
А ето и еквивалента, използващ втория синтаксис:
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;