簡體   English   中英

在存儲過程中將文件的傳遞路徑作為參數

[英]Passing path of File as a Parameter in a Stored Procedure

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

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 [Batch Start Line 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  '+@file+', 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>Jacob.Naizer1145@gmail.com</email>
  </person>
 </persons>
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  '''+@file+''', 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM