2017-05-20 2 views
0

Ich habe eine gespeicherte Prozedur, die einen Dateipfad verwendet, um ihre Daten zu laden. Wenn ich den Pfad direkt in der Prozedur gebe, wie unten gezeigt, funktioniert die Prozedur und die Daten werden geladen.Pfad der Datei als Parameter in einer gespeicherten Prozedur übergeben

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 

aber wenn ich versuche, den Pfad als Parameter zu übergeben, Code unten gezeigt, tritt dieser Fehler auf:

Msg 4860, Ebene 16, Status 1, Prozedur usp_importXML, Line 6 [Start Charge Zeile 38]
Kann nicht geladen werden. Die Datei "+ @ file +" existiert nicht.

Code:

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 Tabellenstruktur:

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 Datenstruktur:

<?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- Wenn Sie teilen können die XML-Struktur mit Daten. Bitte teilen Sie auch das Skript der TempXML-Tabelle. –

+0

@RohitKumar bearbeitet und enthalten die Tabelle und XML-Dateistruktur – Chanter

+0

Warum zitieren Sie "+ @ file +"? Ich hätte nur '@ file' benutzt. – minus

Antwort

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

Danke @Rohit Kumat! Arbeitete absolut gut :)! – Chanter

+0

Prost .. Happy Coding. –

Verwandte Themen