SQL 코드를 사용하여 폴더에서 여러 XML 파일 이름 읽기 허용

openrowset sql sqlbulkcopy tsql xml

문제

하드 코딩 된 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

인기 답변

너는 이것 같이 그것을 시도 할지도 모르다

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.