2013-04-12 3 views
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 , запрос) и exec (sql) AT [linkedsnamename], но каждый время я пытаюсь сделать имя сервера переменной, котор оно терпит неудачу для меня.

Я могу запустить все эти команды вручную в 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)' 

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

ответ

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; 
+0

Вложенные вызовы sp_execsql ... очень приятно. Благодаря! :-) –

+0

Когда LinkedDbName находится в среде EDW, как мне настроить его? – angelcake

+0

@angelcake Как HP EDW? Извините, не знаю. Это работает, потому что предполагается, что связанный сервер также является SQL Server. Для других платформ я не смогу помочь. –

Смежные вопросы