Как создать таблицу на связанном сервере с переменным именем сервера?

Я видел несколько решений о том, как создавать таблицы на связанных серверах с помощью 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], но каждый раз, когда я пытаюсь сделать имя сервера переменной, мне это не удается.

Я могу запускать все эти команды вручную в Query Analyzer, но всякий раз, когда я пытаюсь сделать имя связанного сервера переменной, они терпят неудачу для меня. То, что я пытаюсь сделать, это что-то вроде этого...

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 )'

Можно ли динамически создать таблицу, когда имя связанного сервера и имя базы данных на этом связанном сервере являются объявленными переменными?


person Great Turtle    schedule 12.04.2013    source источник


Ответы (1)


Предполагая, что связанный сервер также является 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;
person Aaron Bertrand    schedule 12.04.2013
comment
Вложенные вызовы sp_execsql... очень приятно. Спасибо! :-) - person Great Turtle; 12.04.2013
comment
Когда LinkedDbName находится в среде EDW, как мне его настроить? - person angelcake; 08.10.2015
comment
@angelcake Нравится HP EDW? Извините, без понятия. Это работает, потому что предполагается, что связанный сервер также является SQL Server. Для других платформ я не смогу помочь. - person Aaron Bertrand; 08.10.2015
comment
Да, это Linux EDW. все в порядке. Большое спасибо! - person angelcake; 08.10.2015