在SQL Server中,linked server支持DDL语句吗?例如,我可以通过linked server去创建一个表吗?如果可以的话,那么有哪一些方式执行DDL语句呢?其实linked server是支持DDL语句的。下面我们来简单演示一下。
首先,我们必须将linked server的rpc out属性(server option)设置为true,这个是linked server执行DDL语句的前提条件
USE [master]
GO
EXEC master.dbo.sp_serveroption @server=N'LNK_SVR_TEST', @optname=N'rpc out', @optvalue=N'true'
GO
如果不开启这个server option的话,执行下面语句就会报错:
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限制。
语法如下:
EXECUTE (``<query>``) AT [<linked server>]
例子:
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删除表
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创建表
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;
原文始发于微信公众号(DBA闲思杂想录):SQL Server Linked Server支持DDL语句吗?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/227790.html