2010-04-09 58 views
3

我正在嘗試編寫一個數據庫腳本(SQL Server 2008),它將一臺服務器上的數據庫表中的信息複製到另一臺服務器上另一個數據庫中的相應表中。在SQL語句中使用參數值

我已閱讀,要做到這一點,正確的方法是使用SQL語句在類似於以下格式:

INSERT INTO <linked_server>.<database>.<owner>.<table_name> SELECT * FROM <linked_server>.<database>.<owner>.<table_name> 

一樣會有被複制多張表,我想聲明變量位於腳本的頂部,以允許用戶指定要使用的每個服務器和數據庫的名稱。這些可以在整個腳本中使用。但是,我不確定如何在實際的SQL語句中使用變量值。我想實現的是像下面這樣:

DECLARE @SERVER_FROM AS NVARCHAR(50) = 'ServerFrom' 
DECLARE @DATABASE_FROM AS NVARCHAR(50) = 'DatabaseTo' 

DECLARE @SERVER_TO AS NVARCHAR(50) = 'ServerTo' 
DECLARE @DATABASE_TO AS NVARCHAR(50) = 'DatabaseTo' 

INSERT INTO @[email protected]_TO.dbo.TableName SELECT * FROM @[email protected]_FROM.dbo.TableName 
... 

我應該如何使用此代碼@變量,以便它能夠正常工作?

此外,你覺得我上面的方法是什麼,我想實現正確的,我應該使用NVARCHAR(50)作爲我的變量類型還是其他什麼東西?

感謝

回答

1

看看http://msdn.microsoft.com/en-us/library/ms188001.aspx - sp_executesql需要一個參數是一個字符串,並執行該字符串的SQL。因此您需要將@SERVER_FROM和其他參數與INSERT INTO部分連接起來以生成整個sql語句,然後傳遞給sp_executesql。

爲nvarchar(50)是好的,除非你的服務器/數據庫名比:)

1

您可以通過一起連接所有的信息來創建SELECT語句,然後使用sp_executesql的 這麼長:

sp_executesql 'INSERT INTO ' + @SERVER_TO + '.' + @DATABASE_TO + 
'.dbo.TableName SELECT * FROM ' + @SERVER_FROM + '.' + 
@DATABASE_FROM+'.dbo.TableName' 
2

有可能是一個更好的方式來做到這一點,但你很可能想在你的例子做的是什麼所謂的動態SQL,你對待語句作爲字符串和執行它。這是第2節: http://www.mssqltips.com/tip.asp?tip=1160

動態SQL有一些主要缺點。你可以看到其他一些方法在那篇文章中可能會更好。

2

對於爲nvarchar(50) - 你會使用sysname更好。這是SQL Server中的同義詞(用於nvarchar(128))並表示對象標識符的最大長度。

0

我喜歡做出這樣的動態SQL東西的模板 - 它是一個更容易維護的複雜報表和有時也好辦了嵌套引用 - 當條件需要在多個地方被重複肯定更容易(如列清單) :

DECLARE @sql AS nvarchar(max); 
SET @sql = 'INSERT INTO {@SERVER_TO}.{@DATABASE_TO}.dbo.TableName 
SELECT * 
FROM {@SERVER_FROM}.{@DATABASE_FROM}.dbo.TableName' 

SET @sql = REPLACE(@sql, '{@SERVER_TO}', QUOTENAME(@SERVER_TO)) 
SET @sql = REPLACE(@sql, '{@DATABASE_TO}', QUOTENAME(@DATABASE_TO)) 
SET @sql = REPLACE(@sql, '{@SERVER_FROM}', QUOTENAME(@SERVER_FROM)) 
SET @sql = REPLACE(@sql, '{@DATABASE_FROM}', QUOTENAME(@DATABASE_FROM)) 

EXEC(@sql)