2011-05-03 123 views
1

下面的t-sql代碼編譯得很好。但是,當我運行它像 執行[SP_ATTACH_NW] N'C:\ MyFolder文件」我得到發生文件激活錯誤。物理文件名'N @ filename

消息5105,級別16,狀態2,過程SP_ATTACH_NW,14號線 出現文件激活錯誤。物理文件名'N @ mdfFileName'可能不正確。診斷並更正其他錯誤,然後重試該操作。

USE master 

GO 

SET ANSI_NULLS ON 

GO 

CREATE PROCEDURE [dbo].[SP_ATTACH_NW] (
    @DestFolder varchar(255) 
) 

AS 

BEGIN 

    SET NOCOUNT ON; 

    Declare @mdfFileName varchar(255) 
    Declare @ldfFileName varchar(255) 

    set @mdfFileName = @DestFolder + '\northwnd.mdf' 
    set @ldfFileName = @DestFolder + '\northwnd.ldf' 

CREATE DATABASE [Northwind] ON 

(FILENAME = [email protected]), 

(FILENAME = [email protected]) 

FOR ATTACH 


END 

請指教。感謝

+1

你不能只是chuck參數放入TSQL語句的中間,並期望用參數值替換。您可以使用動態SQL來執行此操作。無論如何,通過存儲過程看起來很奇怪。 – 2011-05-03 22:29:13

+0

這是什麼用法?爲什麼你需要一個SP來創建一個數據庫? – 2011-05-04 04:22:42

+0

好的。下面的bgn回答了我的問題。我需要將一個數據庫移動到另一個驅動器,以便一個驅動器空間不足的用戶可以運行一個小應用程序來執行此操作。使用sql dmo和c#我能夠分離,移動mdf/ldf文件,但是由於新的mdf/ldf文件夾位置上的文件夾權限問題而導致附加它時失敗。而不是與文件夾權限混淆,我決定通過sp做附加。 – Gullu 2011-05-04 13:18:01

回答

2

你不能在CREATE DATABASE的文件名參數變量(MSDN不顯示在語法@vars)

上面的代碼簡直是尋找常數「n @ mdfFileName」作爲文件名。

您將需要動態SQL打造,串說,@MyBuiltSQL然後運行EXEC(@MyBuiltSQL)

注:「N」字頭這裏不會讓@mdfFileName爲nvarchar反正

+0

thx。我會看看其他的選擇,如sp_attach_db ... – Gullu 2011-05-04 13:18:43