[英]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.