2017-05-20 10 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行目]
バルクロードできません。ファイル "+ @ file +"は存在しません。

コード:

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データ構造:Chanter- @

<?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

あなたが共有することができた場合の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

歓声..ハッピーコーディング。 –

関連する問題