2012-07-20 53 views
0

我有這樣一組T-SQL語句如下:T-SQL:BACKUP CERTIFICATE - 使用與T-SQL語句的變量

DECLARE @somefilepath as nvarchar = 'c:\somedir\somefile.ext'; 
DECLARE @anotherfilepath as nvarchar = 'c:\somedir\somefile2.ext'; 
DECLARE @somepassword as nvarchar = 'password'; 
BACKUP CERTIFICATE MyCertificate TO FILE = @somefilepath 
WITH PRIVATE KEY (FILE = @anotherfilepath, 
ENCRYPTION BY PASSWORD = @somepassword); 
當我執行 '解析',以測試報表

,我得到:「@somefilepath」附近的語法不正確。看起來變量不能用於這種類型的語句。有人能幫助我理解這是否屬實?

有沒有辦法讓這個備份與變量一起工作?

我有一個更大的腳本,我希望用戶能夠輕鬆地在一個位置更改路徑和密碼,而不必搜索需要手動更改的位置的文件。

回答

2

使用動態SQL。

DECLARE 
    @somefilepath as nvarchar(255) = 'c:\somedir\somefile.ext', 
    @anotherfilepath as nvarchar(255) = 'c:\somedir\somefile2.ext', 
    @somepassword as nvarchar(100) = 'password', 
    @SQL as nvarchar(max); 

SET @SQL = 'BACKUP CERTIFICATE MyCertificate TO FILE = ' + QuoteName(@somefilepath, '''') + ' 
WITH PRIVATE KEY (FILE = ' + QuoteName(@anotherfilepath, '''') + ', 
ENCRYPTION BY PASSWORD = ' + QuoteName(@somepassword, '''') + ');'; 
EXEC (@SQL); 

此外,永遠,永遠指定您char數據類型的長度。如果你沒有養成這種習慣,它會在某一天嚴重地咬你。以下是原因:

  • 在存儲過程中,參數n/var/char的默認長度爲1個字符。
  • 在其他情況下,對於n/var/char參數的默認長度爲30個字符,這可能罰款的varchar版本,但幾乎可以肯定錯了char。如果該值用於使用SELECT INTO創建表,它將是一個神祕的長度,而不是明確選擇的長度。
  • 未明確定義長度會迫使下一位訪問您代碼的開發人員知道長度爲varchar的確切規則,並且由於它隱含而不是顯式,因此很可能會欺騙他。假設列的長度需要改變,同樣強制改變參數長度,但由於參數沒有長度,所以會跳過。
  • 如果您確實需要1個字符或30個字符,最好指定它,以便下一位開發人員訪問代碼時不會看到缺少長度作爲錯誤,並且浪費時間試圖弄清楚它應該是什麼是或者這是否是一個錯誤。
  • 這將有助於您的聲譽,避免被專家祕密嘲笑爲無知初學者。
+1

你可以使用'QUOTENAME(@somefilepath,'''')' – 2012-07-20 18:31:51

+0

啊,是的,謝謝@Remus,我忘了你可以給'quotename'提供一個字符。 – ErikE 2012-07-20 19:00:06

+0

@ErikE謝謝!這工作完美。我會記住你指定​​char數據類型的長度。這個建議的原因是什麼?理解爲什麼會幫助我記住這樣做。 – 2012-07-25 18:44:58