我创建了一个存储过程,可以使用硬编码的XML文件名正常运行。但是我无法对文件名进行硬编码,因为每当有新文件进入时它都会有不同的文件名,尽管XML结构保持不变。
我想知道是否有人可以帮助/指出我正确的方向。这是我的代码,使用硬编码的xml文件名。现在我需要它来读取C:\ temp \文件夹中存在的所有XML文件,而不仅仅是一个。
CREATE PROC [dbo].[XMLIputData] as
;WITH XMLNAMESPACES(DEFAULT 'http://www.sxi.co.za/XMLSchema')
INSERT INTO FNBXMLData
(
[CIpriority],
[ref_num],
[summary],
[act_log],
[impact.sym],
[category.sym],
[affected_resource.name],
[affected_resource.class.type],
[status.sym],
[customer.billing_code.name],
[affected_resource.model.sym],
[customer.first_name],
[customer.last_name],
[customer.phone_number],
[customer.beeper_phone] ,
[customer.email_address] ,
[location.name] ,
[affected_resource.location.address1] ,
[affected_resource.location.address6] ,
[affected_resource.location.city.sym] ,
[affected_resource.location.state.sym] ,
[category.service_type.sys] ,
[affected_resource.znr_inc_service_type.sym] ,
[affected_resource.znr_cr_service_type.sym] ,
[category.service.type.sym] ,
[SXI_SigReg_ActionField] ,
[SXI_SigReg_EntryIdField] ,
[SXI_SigReg_EpochTimeField] ,
[SXI_SigReg_UniqueIdField])
SELECT
X.product.query('CIpriority').value('.', 'varchar(5)'),
X.product.query('ref_num').value('.', 'varchar(20)'),
X.product.query('summary').value('.', 'varchar(200)'),
X.product.query('act_log').value('.', 'varchar(200)'),
X.product.query('impact.sym').value('.', 'varchar(200)'),
X.product.query('category.sym').value('.', 'varchar(200)'),
X.product.query('affected_resource.name').value('.', 'varchar(200)'),
X.product.query('affected_resource.class.type').value('.', 'varchar(200)'),
X.product.query('status.sym').value('.', 'varchar(50)'),
X.product.query('customer.billing_code.name').value('.', 'varchar(20)'),
X.product.query('affected_resource.model.sym').value('.', 'varchar(50)'),
X.product.query('customer.first_name').value('.', 'varchar(20)'),
X.product.query('customer.last_name').value('.', 'varchar(20)'),
X.product.query('customer.phone_number').value('.', 'varchar(20)'),
X.product.query('customer.beeper_phone').value('.', 'varchar(20)'),
X.product.query('customer.email_address').value('.', 'varchar(200)'),
X.product.query('location.name').value('.', 'varchar(200)'),
X.product.query('affected_resource.location.address1').value('.', 'varchar(200)'),
X.product.query('affected_resource.location.address6').value('.', 'varchar(200)'),
X.product.query('affected_resource.location.city.sym').value('.', 'varchar(200)'),
X.product.query('affected_resource.location.state.sym').value('.', 'varchar(200)'),
X.product.query('category.service_type.sys').value('.', 'varchar(200)'),
X.product.query('affected_resource.znr_inc_service_type.sym').value('.', 'varchar(200)'),
X.product.query('affected_resource.znr_cr_service_type.sym').value('.', 'varchar(200)'),
X.product.query('category.service.type.sym').value('.', 'varchar(200)'),
X.product.query('SXI_SigReg_ActionField').value('.', 'varchar(200)'),
X.product.query('SXI_SigReg_EntryIdField').value('.', 'varchar(200)'),
X.product.query('SXI_SigReg_EpochTimeField').value('.', 'varchar(200)'),
X.product.query('SXI_SigReg_UniqueIdField').value('.', 'varchar(200)')
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK 'C:\temp\X-ServiceBroker~FNBUSD-DIEBOLD~702012850747092.75.xml',
SINGLE_BLOB) AS T(x)
) AS T(x)
CROSS APPLY x.nodes('XServiceBroker') AS X(product);
GO
答案 0 :(得分:0)
您可以像这样尝试
--You need a table to insert into
CREATE TABLE dbo.XmlTarget(MyXML XML);
--this is the dynamically changing filename
DECLARE @FileName NVARCHAR(250) =N'X:\PathToFile\TestXml.xml';
--this is a dynamic command to allow a changing filename
DECLARE @cmd NVARCHAR(MAX)=
'INSERT INTO dbo.XmlTarget(MyXML)
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK ''' + @FileName + ''',SINGLE_BLOB) AS T(x);'
--execute the statement
EXEC (@cmd);
--Now the XML is in the table
SELECT * FROM dbo.XmlTarget;
--CleanUp
DROP TABLE dbo.XmlTarget;