2016-04-12 5 views
1

を使用してフォルダから複数のXMLファイル名を読み取ることができます。ハードコードされたXMLファイル名で正常に機能するストアドプロシージャが作成されました。しかし、XML構造は同じままですが、新しいファイルが来るたびに別のファイル名になるので、ファイル名をハードコーディングしておくことはできません。SQLコード

誰かが助けて正しい方向に向けるかどうか疑問に思った。ここでは、ハードコードされた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

ようにそれを試してみてください:この 'X.product.query( 'location.name')を短縮するために十分であるべき値(「varchar型。 '' (200) ') 'を' X.product.value('(location.name)[1] '、' varchar(200) ') 'に設定します。 '.query()'と '.value()'のこの組み合わせは、しばしば見つかるはずですが、実際には必要ではありません。 – Shnugo

+0

こんにちは、病院にいなければならなかったのは申し訳ありません。私は今日それに戻って今日です...私はこの解決策を試してみましょうと私は更新されます。あなたの助けをありがとうございます – Zonke

+0

あなたは再びうまくいけるといいですね!それは今働いていますか?さらに助けが必要ですか? SOの回答を得ているほとんどの専門家が評判の点で飢えているという事実にご注意ください。 [これを読んでください:誰かの回答](私はむしろ中毒です;-) – Shnugo

答えて

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

申し訳ありませんが、私は少し混乱して、私はこれに精通していません..私はxmlファイル名を知らないので、xmlファイルがどこに存在するかを知るだけなので、@ FileName変数を宣言するセクションで、TestXml.xmlはどのxmlに対しても動作しますか? – Zonke

+0

これを試してみて、結果としてxmlファイルを返し、MyXMLという名前を付けました。私は何をしようとしているのかをさらに説明する必要があると思う。 xmlファイルに格納されるデータを保存するテーブルがすでにあります。これは成功し、テーブルにはxml情報がタグ内に必要に応じて埋め込まれます。 今私の問題は嫌です私はCドライブ上のそのフォルダに入ってくるすべてのXMLファイルを読むことができる必要があるので、xmlファイル名をハードコードしてください。 – Zonke

+0

@ Zonkeあなたの質問をもう一度読みました...あなたのストアドプロシージャのテーブルについてあなたが話しているテーブルはありますか?ファイルは常に、将来どのような構造になっていますか?私はXMLを最初にタイプのXML(これは任意の有効なXMLで動作します)の列に読み込み、そこから続行することをお勧めします。しかし、多分私は何かが間違っている... – Shnugo