2017-05-20 37 views
0

我有一個使用文件路徑加載其數據的存儲過程。當我如下所示直接在過程中提供路徑時,該過程將工作並加載數據。將文件的路徑作爲參數傳遞到存儲過程

CREATE PROCEDURE main.usp_importXML(@file VARCHAR) 
AS 
BEGIN 
    DECLARE @xmlFile as XML 

    SET @xmlFile = (SELECT CONVERT(XML,BulkColumn) as BulkColumn 
    FROM OPENROWSET (BULK 'C:\Users\User\Desktop\people.xml', SINGLE_BLOB) AS t) 
    INSERT INTO main.tempXML (name,surname,dob,gender,locality,postcode,job,salary,email) 
    SELECT 
    name = t.value ('name[1]', 'NVARCHAR(20)'), 
    surname = t.value ('surname[1]', 'NVARCHAR(20)'), 
    dob = t.value ('dob[1]', 'DATETIME'), 
    gender = t.value ('gender[1]', 'CHAR'), 
    locality = t.value ('locality[1]', 'NVARCHAR(20)'), 
    postcode = t.value ('postcode[1]', 'NVARCHAR(20)'), 
    job = t.value ('job[1]', 'NVARCHAR(50)'), 
    salary = t.value ('salary[1]', 'INTEGER'), 
    email = t.value ('email[1]', 'NVARCHAR(50)') 
    FROM @xmlFile.nodes('/persons/person') AS xTable(t); 
END 
GO 

然而,當我試圖通過的路徑作爲參數,如下所示的代碼,就會發生這樣的錯誤:

消息4860,級別16,狀態1,過程usp_importXML,第6行[批量開始第38行]
無法批量加載。文件「+ @文件+」不存在。

代碼:

CREATE PROCEDURE main.usp_importXML(@file VARCHAR) 
AS 
BEGIN 
    DECLARE @xmlFile as XML 

    SET @xmlFile = (SELECT CONVERT(XML,BulkColumn) as BulkColumn 
    FROM OPENROWSET (BULK '[email protected]+', SINGLE_BLOB) AS t) 
    INSERT INTO main.tempXML (name, surname, dob, gender, locality, postcode, job, salary, email) 
     SELECT 
      name = t.value ('name[1]', 'NVARCHAR(20)'), 
      surname = t.value ('surname[1]', 'NVARCHAR(20)'), 
      dob = t.value ('dob[1]', 'DATETIME'), 
      gender = t.value ('gender[1]', 'CHAR'), 
      locality = t.value ('locality[1]', 'NVARCHAR(20)'), 
      postcode = t.value ('postcode[1]', 'NVARCHAR(20)'), 
      job = t.value ('job[1]', 'NVARCHAR(50)'), 
      salary = t.value ('salary[1]', 'INTEGER'), 
      email = t.value ('email[1]', 'NVARCHAR(50)') 
     FROM 
      @xmlFile.nodes('/persons/person') AS xTable(t); 
END 
GO 

EXEC main.usp_importXml [C:\Users\User\Desktop\people.xml] 

main.tempXML表結構:

CREATE TABLE main.tempXML 
(
    id  UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY, 
    [name] VARCHAR(100), 
    surname VARCHAR(100), 
    dob  VARCHAR(100), 
    gender VARCHAR(10), 
    locality VARCHAR(100), 
    postcode VARCHAR(100), 
    job  VARCHAR(100), 
    salary VARCHAR(20), 
    email VARCHAR(100) 
); 

people.xml數據結構:

<?xml version="1.0"?> 
    -<persons> 
    -<person> 
     <name>Jacob</name> 
     <surname>Naizer</surname> 
     <dob>19840717</dob> 
     <gender>M</gender> 
     <locality>Mellieha</locality> 
     <postcode>MEL876</postcode> 
     <job>JAVA Developer</job> 
     <salary>20733</salary> 
     <email>[email protected]</email> 
    </person> 
</persons> 
+0

@ Chanter-如果你可以分享xml結構與一些數據。還請分享tempXML表的腳本。 –

+0

@RohitKumar編輯幷包含了表格和xml文件結構 – Chanter

+0

爲什麼要引用''+ @ file +''?我只會使用'@ file'。 – minus

回答

2
1. Make use of dynamic query. 
2. Increase filename variable size. 

Create PROCEDURE main.usp_importXML(@file VARCHAR(1000)) 

AS 
BEGIN 

Declare @Query varchar(8000) 

SET @Query =' 
    DECLARE @xmlFile as XML 
    SET @xmlFile = (SELECT CONVERT(XML,BulkColumn) as BulkColumn 
    FROM OPENROWSET (BULK '''[email protected]+''', SINGLE_BLOB) AS t) 
    INSERT INTO main.tempXML (name,surname,dob,gender,locality,postcode,job,salary,email) 
    SELECT 
    name = t.value (''name[1]'', ''NVARCHAR(20)''), 
    surname = t.value (''surname[1]'', ''NVARCHAR(20)''), 
    dob = t.value (''dob[1]'', ''DATETIME''), 
    gender = t.value (''gender[1]'', ''CHAR''), 
    locality = t.value (''locality[1]'', ''NVARCHAR(20)''), 
    postcode = t.value (''postcode[1]'', ''NVARCHAR(20)''), 
    job = t.value (''job[1]'', ''NVARCHAR(50)''), 
    salary = t.value (''salary[1]'', ''INTEGER''), 
    email = t.value (''email[1]'', ''NVARCHAR(50)'') 
    FROM @xmlFile.nodes(''/persons/person'') AS xTable(t);' 
    Print @Query 
    exec(@Query) 
END 
+0

謝謝@Rohit Kumat!工作絕對好:)! – Chanter

+0

乾杯..快樂編碼。 –

相關問題