SQL Server通过链接服务器可以执行DDL语句
Tags: DDLMSSQLSQL Server链接服务器
简介
在SQL Server中,linked server支持DDL语句吗?例如,我可以通过linked server去创建一个表吗?如果可以的话,那么有哪一些方式执行DDL语句呢?其实linked server是支持DDL语句的。下面我们来简单演示一下。
首先,我们必须将linked server的rpc out属性(server option)设置为true,这个是linked server执行DDL语句的前提条件
1 2 3 4 | USE [master] GO EXEC master.dbo.sp_serveroption @server=N'LNK_SVR_TEST', @optname=N'rpc out', @optvalue=N'true' GO |
如果不开启这个server option的话,执行下面语句就会报错:
1 2 3 4 5 6 7 8 9 | EXEC (' CREATE TABLE [dbo].[Test]( [ID] [INT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](32) NULL ); ') AT LNK_SVR_TEST; Msg 7411, Level 16, State 1, Line 4 未将服务器 'LNK_SVR_TEST' 配置为用于 RPC。 |
注意:LNK_SVR_TEST是当前用作测试的linked server。
linked server执行DDL语句的方式:
方式1:EXECUTE AT 方法
EXECUTE AT 方法,允许针对链接服务器执行动态SQL。EXECUTE调用的参数之一是AT,它旨在绕过OPENQUERY和OPENROWSET限制。
语法如下:
1 | EXECUTE (``<query>``) AT [<linked server>] |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | EXEC (' CREATE TABLE [dbo].[Test]( [ID] [INT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](32) NULL ); ') AT LNK_SVR_TEST; EXEC (' ALTER TABLE [dbo].[Test] ADD [Sex] BIT; ') AT LNK_SVR_TEST; EXEC (' DROP TABLE [dbo].[Test] ; ') AT LNK_SVR_TEST; |
方式2:使用sp_executesql执行DDL语句
具体例子如下所示:
通过linked server删除表
1 2 3 4 5 6 7 8 9 10 | DECLARE @LinkedServerName VARCHAR(32)='LNK_SVR_TEST'; DECLARE @LinkedDbName VARCHAR(32)='UniMonDB' DECLARE @sql NVARCHAR(MAX), @exec NVARCHAR(MAX); SET @sql = N'DROP TABLE dbo.TEST;'; SET @exec = QUOTENAME(@LinkedServerName) + N'.' + QUOTENAME(@LinkedDbName) + N'.sys.sp_executesql'; EXEC @exec @sql; |
通过linked server创建表
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE @LinkedServerName VARCHAR(32)='LNK_SVR_TEST'; DECLARE @LinkedDbName VARCHAR(32)='UniMonDB' DECLARE @sql NVARCHAR(MAX), @exec NVARCHAR(MAX); SET @sql = N' CREATE TABLE [dbo].[Test]( [ID] [INT] IDENTITY(1,1) NOT NULL, [Name] [NVARCHAR](32) NULL );'; SET @exec = QUOTENAME(@LinkedServerName) + N'.' + QUOTENAME(@LinkedDbName) + N'.sys.sp_executesql'; EXEC @exec @sql; |