簡體   English   中英

在SQL語句中使用參數值

[英]Using Parameter Values In SQL Statement

我正在嘗試編寫一個數據庫腳本(SQL Server 2008),它將信息從一台服務器上的數據庫表復制到另一台服務器上另一個數據庫中的相應表。

我已經讀過,正確的方法是使用類似於以下格式的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 @SERVER_TO.@DATABASE_TO.dbo.TableName SELECT * FROM @SERVER_FROM.@DATABASE_FROM.dbo.TableName
...

我應該如何在此代碼中使用@變量才能使其正常工作?

另外,你認為我上面的方法對於我想要實現的目標是否正確,我應該使用NVARCHAR(50)作為我的變量類型還是其他什么?

謝謝

有一種更好的方法可以做到這一點,但你可能在你的例子中嘗試做的是所謂的動態SQL,你將語句視為一個字符串並執行它。 這將是第2節: http//www.mssqltips.com/tip.asp?提示= 1160

動態SQL有一些主要缺點。 您會在該文章中看到其他幾種可能更好的方法。

如果要執行動態生成的查詢,則必須使用sp_ExecuteSQL

HTH

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

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

nvarchar(50)沒問題,除非您的服務器/數據庫名稱長於:)

您可以通過將所有信息連接在一起來創建select語句,然后使用sp_executesql,這樣:

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

我喜歡為像這樣的動態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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM