2011-04-08 66 views
5

我想將文件/文件組添加到現有的數據庫,但我需要從變量中獲取路徑,因爲在完成此腳本時它會有所不同。當我在SQL Management Studio 2008 R2中檢查腳本時,它會在FILENAME = @Path處返回錯誤。ALTER DATABASE/ADD FILE/VARIABLE FILENAME?

如何使用該變量?

腳本不會從命令行運行!

ALTER DATABASE [MyDB] 
ADD FILEGROUP [MyDB_FileStream] CONTAINS FILESTREAM 
GO 

DECLARE @Path VARCHAR(MAX) 
SET @Path = 'C:\whatEverIWantItToBe\ThisCouldChangeWithLogic\YouGetThePoint\' 

ALTER DATABASE [MyDB] 
ADD FILE 
    (NAME = 'MyDB_FileStream' 
    , FILENAME = @Path 
    ) 
TO FILEGROUP [MyDB_FileStream] 

回答

8

使用動態SQL:

Declare @Path nvarchar(max) 
Declare @Sql nvarchar(max) 

Set @Path = 'C:\whatEverIWantItToBe\ThisCouldChangeWithLogic\YouGetThePoint\' 

Set @Sql = 'Alter Database [MyDb] 
    Add File(Name = ''MyDb_FileStream'' 
      , FileName = ' + QuoteName(@Path, '''') 
      + ') To FileGroup [MyDbFileStream]' 

Exec(@Sql) 
+0

謝謝!我一直討厭動態SQL,因爲它在我看來似乎「逃脫」瞭解析錯誤......但也許它有其用途 – 2011-04-08 04:49:19

+4

只要確保@Path來自可信來源,而不是小Bobby Tables http:// xkcd .com/327/ – SqlACID 2011-04-08 12:38:19

+0

@SqlACID - 你可以傳入@Path變量,這會導致執行你不想要的語句?當你嘗試從客戶端執行存儲的proc(大概是因爲我們使用了一個變量)而不是從proc本身內部執行時,問題就出現了。假設對存儲的proc調用的調用進行了參數化,那麼可傳遞給@Path的內容不會被轉義或出錯? – Thomas 2011-04-08 15:59:47

0

我沒有試過,但通常動態SQL可以幫助解決這類問題

+0

你有個例子嗎? – 2011-04-08 04:36:23

2

不知道這會爲你工作,但如果你要在命令行運行腳本你可以這樣做:

ALTER DATABASE [MyDB] 
ADD FILE (NAME = 'MyDB_FileStream', FILENAME = $(path)) 
TO FILEGROUP [MyDB_FileStream] 

而且隨着運行:

sqlcmd -s servername -i script.sql -v path="path to the file" 
+0

問題已編輯....我不會也不能從命令行運行它 – 2011-04-08 04:38:29