2016-04-12 34 views
1

Sabit kodlanmış bir XML dosya adıyla düzgün çalışan bir saklı yordam oluşturdum. Ancak, dosya ismini kodlamaya devam edemem, XML dosyasının yapısı aynı kalmasına rağmen, yeni bir dosya her geldiğinde farklı bir dosya adı olacaktır.SQL kod kullanarak birden çok XML dosya adını okumaya izin ver

Kimsenin bana doğru yönde yardım edip/gösterebileceğini merak ettim. İşte kodlanmış xml dosya adıyla çalışan kodum. Şimdi sadece bir değil, C: \ temp \ klasöründe bulunan tüm XML dosyalarını okumak gerekiyor.

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

gibi deneyebilirsiniz:. '' 'X.product.query ('location.name') kısaltmak için yeterli olacaktır değeri (, 'varchar (200) ') 'bu' X.product.value' ('(location.name) [1]', 'varchar (200)') '. '.query()' ve '.value()' nin bu kombinasyonu genellikle bulunmalıdır, ama gerçekten gerekli değildir ... – Shnugo

+0

Merhaba evet, özür dilerim dün hasta olmak zorundaydı. Yine de bugün buna geri döndüm ... Bu çözümü deneyeyim ve güncelleyeceğim. Yardımınız için çok teşekkür ederim – Zonke

+0

Umarım yine iyisiniz! Şimdi çalışıyor mu? Daha fazla yardıma ihtiyacınız var mı? Lütfen SO'ya cevap veren çoğu profesyonelin itibar puanlarına aç olduğu gerçeğinin farkında olun. [Lütfen şunu okuyunuz: birisi cevap] (http://stackoverflow.com/help/someone-answers), ben oldukça bağımlıyım ;-) – Shnugo

cevap

0

Sen Btw bu

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

Tamam üzgünüm biraz kafam karıştı, ben buna aşina değilim .. xml dosya adını bilmeyeceğim ve yalnızca xml dosyalarının bulunduğu yolu bilecek olan @FileName değişkenini bildirdiğim bölümde, herhangi bir xml için TestXml.xml çalışacak mı? – Zonke

+0

Tamam Bunu denedim ve sonuç olarak xml dosyasını döndürür ve MyXML olarak adlandırır. Sanırım yapmaya çalıştığım şey hakkında daha fazla açıklamam gerekiyor. Zaten xml dosyasında olacak verileri kaydetmek için bir tablonuz var ve bu başarılı ve tablo etiketleri içinde xml bilgileri ile doldurulur .. Sorunum şu anda istemiyorum C sürücüsündeki bu klasöre gelen tüm xml dosyalarını okuyabildiğim için xml dosya adını sabit kodla. – Zonke

+0

@Zonke Sorunuzu tekrar okudum ... Tablo, Saklanan Yordamınızın tablosu hakkında konuşuyor mu? Dosyalar her zaman ve gelecekte aynı yapıda mı? Önce XML'i tek bir XML türü sütununa (bu geçerli herhangi bir XML ile çalışır) okuyup ondan devam etmenizi öneririm. Ama belki yanlış bir şeyim var ... – Shnugo