2

我已经看到了一些关于如何使用它们在链接服务器上创建表的解决方案,EXEC('some sql') AT [LINKED_SERVER_NAME]并且它们是手动工作的。

我可以使用 DML 查询,例如

EXEC ( 'select * from [' + @DbServerName + '].[' + @DbName + '].dbo.someTable' )

我怎样才能为 DDL 查询做类似的事情,比如

EXEC ( 'CREATE TABLE [' + @DbServerName + '].[' + @DbName + '].dbo.someTable ( id int null) ' )

我玩弄了select * from openquery( linkedservername , query)exec(sql) AT [ linkedservername ],但每次我尝试将服务器名称设为变量时,它都会失败。

我可以在查询分析器中手动运行所有这些命令,但是每当我尝试将链接服务器名称设为变量时,它们对我来说都失败了。我正在尝试做的是这样的事情......

DECLARE @LinkedServerName nvarchar(100)
DECLARE @LinkedDbName nvarchar(100)
SET @LinkedServerName = 'SVR2'
SET @LinkedDbName = 'DB2'

DECLARE @DDL_QUERY nvarchar(1000)
SET @DDL_QUERY = 'CREATE TABLE [' + @LinkedDbName + '].dbo.T1 ( id int null )'

-- Current failed ideas
EXEC( @DDL_QUERY ) AT @LinkedServerName
SELECT * FROM OPENQUERY(@LinkedServerName, @DDL_QUERY)
EXEC( 'CREATE TABLE [' + @LinkedServerName + '].[' + @LinkedDbName + '].dbo.T1( id int null )'

当链接服务器名称和该链接服务器上的数据库名称都是声明变量时,是否可以动态创建表?

4

1 回答 1

4

假设链接服务器也是 SQL Server(或可能是 Sybase):

DECLARE @table NVARCHAR(MAX), @sql NVARCHAR(MAX);

SET @table = N'CREATE TABLE dbo.T1(id INT NULL);';

SET @sql = N'EXEC ' + QUOTENAME(@LinkedServerName) + N'.' 
  + QUOTENAME(@LinkedDbName) + N'.sys.sp_executesql @table;';

EXEC sys.sp_executesql @sql, N'@table NVARCHAR(MAX)', @table;

稍微不那么冗长的语法:

DECLARE @sql NVARCHAR(MAX), @exec NVARCHAR(MAX);

SET @sql = N'CREATE TABLE dbo.T1(id INT NULL);';

SET @exec = QUOTENAME(@LinkedServerName) + N'.' 
  + QUOTENAME(@LinkedDbName) + N'.sys.sp_executesql';

EXEC @exec @sql;
于 2013-04-12T15:53:22.563 回答