2017-01-06 7 views
1

SQL Server 2014を使用して多数のXMLファイルをクエリしようとしています。以下のコードを使用していますが、何も返されないため構文が間違っています。私の疑惑は、XMLファイルには奇妙なことがあります。SQLでOPENXMLを使用してXMLファイルをクエリできない

XMLテキストの一部のみをローカルに置くのではなく、クエリファイルに直接入れると、動作しているように見えますが、ファイルがたくさんあり、手動でローカルソースからクエリできるようにする必要がありますファイルの操作。

例XML:https://s3.amazonaws.com/irs-form-990/201600349349300510_public.xml

マイコード:事前に

DECLARE @x xml 
SELECT @x = R 
FROM OPENROWSET (BULK 'C:\Users\USER\990\Example.xml', SINGLE_BLOB) AS  ReturnData(R) 

SELECT @x 

DECLARE @hdoc int 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @x 

SELECT * FROM OPENXML (@hdoc, '/Return/ReturnData/IRS990ScheduleHIRS990ScheduleH/FinancialAssistanceAtCostTyp',3) 
    WITH (FinancialAssistancePolicyInd int '../FinancialAssistancePolicyInd', 
     FPGReferenceDiscountedCareInd int '../FPGReferenceDiscountedCareInd', 
     PersonsServedCnt int, 
     NetCommunityBenefitExpnsAmt int) 

EXEC sp_xml_removedocument @hdoc 

感謝。これを行う良い方法がある場合は、私に教えてください。私はSQLでXMLを扱うのが初めてです。

答えて

0

、いくつかの欠点があります:OPENXML FROM

  • が古くなって、それ以上を使用すべきではありません(まれな例外が存在する)

  • があなたのXMLが

  • 宣言する必要があります既定の名前空間を、含ま
  • あなたのXPathは間違っている:/Return/ReturnData/IRS990ScheduleHIRS990ScheduleH/があるべき/Return/ReturnData/IRS990ScheduleH/

しかし、とにかくあなたは近代的なXQueryの方法に目を向ける。これを試してみてください:

- これはXMLを宣言された変数に読み込みます。

- 注意があなたのXMLがutf-8で宣言され、これはよりも、最初の名前空間(複数可)を宣言し、

DECLARE @x xml 
SELECT @x = R 
FROM OPENROWSET (BULK 'C:\Users\USER\990\Example.xml', SINGLE_BLOB) AS ReturnData(R); 

- このクエリがある...特殊文字での問題につながる可能性があります.nodes().value()を使用してください:

WITH XMLNAMESPACES(DEFAULT 'http://www.irs.gov/efile' 
          ,'http://www.w3.org/2001/XMLSchema-instance' AS xsi) 
SELECT ct.value('(FinancialAssistancePolicyInd)[1]','int') AS FinancialAssistancePolicyInd 
     ,ct.value('(FPGReferenceDiscountedCareInd)[1]','int') AS FPGReferenceDiscountedCareInd 
     ,ct.value('(FinancialAssistanceAtCostTyp/PersonsServedCnt)[1]','int') AS PersonsServedCnt 
     ,ct.value('(FinancialAssistanceAtCostTyp/NetCommunityBenefitExpnsAmt)[1]','int') AS NetCommunityBenefitExpnsAmt 
FROM @x.nodes('/Return/ReturnData/IRS990ScheduleH') AS A(ct) 
+0

ありがとう、理論とクエリのために!本当にそれを訴える。私は、特殊文字が問題になることは間違いないと思っています。あなたが送ったコードは、XML文書のその部分に対しては、より早い部分のために働いていないので、きれいです。 (もしコードがとにかく動くはずだったら、私は間違いをしたかもしれません。) 私は特殊文字をどのように扱うことができますか? – riyadude

+1

@riyadude特殊文字について:文字列を 'NVARCHAR(MAX)'型の変数に読み込んだ後、 ''宣言を切り捨て、これをXML型の変数に設定することをお勧めします。疑問符をプレースホルダとして取得したくない場合は、特殊文字は 'NVARCHAR(2バイトユニコード)である必要があります...しかし、XML宣言に' encoding = "utf-8" '(または何か* utf-16以外ではこれは動作しません(* can not-switch-encoding-error *)。*コードがとにかく動作するはずだったかどうかをお知らせください*:これはわかりません... – Shnugo

+0

実際にすべて動作しています今度は特別なキャラクターの問題にぶつかりませんが、もし私がそうしたら、この投稿をチェックしてみましょう。 – riyadude

関連する問題