2014-05-09 56 views
0

我在從xml文件中加載數據時遇到了一些嚴重的問題。我想將其聲明爲以.xml文件名作爲參數的過程。帶有FileName變量的SQL Server存儲過程

GO 
ALTER PROCEDURE loadXML 
@FileName varchar(50) 
AS 
BEGIN 
    DECLARE @XML AS XML,@hDoc AS INT 
    SELECT @XML = CONVERT(XML, BulkColumn) 
    FROM OPENROWSET(BULK 'D:\ '[email protected] , SINGLE_BLOB) AS x; 

    EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 

    INSERT INTO [dbo].[Client] 
    SELECT * 
    FROM OPENXML(@hDoc, 'orderType/client') 

    WITH 
    (
     OrderId varchar(200) '../../../sn', 
     Client_number varchar(200) 'client_number', 
     FirstName varchar(200) 'firstname', 
     LastName varchar(200) 'lastname', 
     E-Mail varchar(200) 'email' 
    ) 

    EXEC sp_xml_removedocument @hDoc 

END 

exec loadXML 'order2.xml' 

很明顯,這段代碼不起作用,因爲@FilePath變量附近有一個語法錯誤。我試圖用整個SELECT部分​​來創建字符串變量,但它不起作用。

+0

'FROM OPENROWSET(BULK'+'D:\'+ @ FileName'',SINGLE_BLOB)AS x;'?我會說你的單引號搞砸了。哦,請發佈確切的錯誤消息。 –

+0

好吧,我用報價清理了這個爛攤子,謝謝。使用此特定代碼收到的錯誤是:消息102,級別15,狀態1,過程loadXML,行7 '+'附近的語法不正確。 – PRHMN

+0

你不能像這樣連接。最好的辦法是將我的答案中提到的整個路徑作爲參數傳遞。 – Rahul

回答

1

爲什麼不傳遞整個路徑以及驅動器名稱作爲參數。我的意思是D:\folder1\file.xml

假設@FileName參數具有像D:\folder1\file.xml這樣的完整路徑,那麼您可以使用動態查詢來實現您在下面查找的內容。試一試

DECLARE @sqlCommand varchar(1000) 
SET @sqlCommand = 'set @XML = (SELECT '+ @XML + ' = CONVERT(XML, BulkColumn) 
    FROM OPENROWSET(BULK ' + @FileName +' , SINGLE_BLOB) AS x)'; 

declare @xml xml; 

EXEC sp_executesql @sqlCommand, N'@XYZ xml output', @xml output 


EXEC sp_xml_preparedocument @hDoc OUTPUT, @XYZ; 

//rest of the code here 
+0

當我把變量放在OPENROWSET中時,它不會工作,因爲 Msg 102,Level 15,State 1,Procedure loadXML,Line 7 '@FileName'附近語法不正確。 – PRHMN

+0

@PRHMN,現在呢?編輯答案。 – Rahul

+0

還沒有。 Msg 156,Level 15,State 1,Procedure loadXML,Line 8 關鍵字'SELECT'附近的語法不正確。 Msg 102,Level 15,State 1,Procedure stack,Line 8 ')'附近語法不正確。 不會創建過程,並且BulkColumn,SELECT和SINGLE_BLOB帶下劃線。 – PRHMN