2013-04-12 51 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 [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

假設鏈接服務器也是SQL服務器(或可能的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。對於其他平臺,我無法提供幫助。 –

相關問題