私はアプリケーションからデータを取り込むデータベースを扱っています。データはフィールドにXMLとして表示されますが、データ型は実際にはvarchar2です。角括弧内の名前でデータを列に分割するにはどうすればよいですか?最終結果は、<の各名前が列ヘッダーになり、終了と終了の間の値が行データになります。フィールドを複数の列に区切るXML/Varchar2/SQL
例:
列名:VAL_TXT
xml:<objects.CollegeInfo>
<collegeOrgId>0000000000</collegeOrgId>
<useCollegeOrgId>0000000000</useCollegeOrgId>
<collegeName>University [City, ST, USA]</collegeName>
<collegeCountry>USA</collegeCountry>
<collegeState>ST</collegeState>
<fromDate>08/15/2004</fromDate>
<toDate>05/15/2007</toDate>
<degreeDate>08/15/2008</degreeDate>
<gpaType>4PT</gpaType>
<gradePointAverage>3.5</gradePointAverage>
<enteredDegree>Bachelor's</enteredDegree>
</objects.CollegeInfo>
各行は、同様にそれらの異なるフィールドを有することができます。
また、このデータはOracleサーバーに格納されていますが、MS SQLのリンクサーバー経由でデータを取得しています。
ありがとうございます!
EDIT:メッセージ9403、レベル16、状態1、行1 XMLの解析:私は、私は、エラー受信
SELECT CAST(a.VAL_TXT as xml).value('(/objects.CollegeInfo/collegeOrgId)[1]','INT') AS col1
from TABLE a;
次しようとしなかった行0、文字0を、認識されていない入力署名を
新EDIT(2回目の試行):
SELECT *
FROM
(
SELECT
VAL_TXT = CAST(VAL_TXT AS XML)
FROM
TABLE
) t
CROSS APPLY
(
SELECT
collegeOrgId = x.n.value('collegeOrgId[1]','varchar(20)')
,useCollegeOrgId = x.n.value('useCollegeOrgId[1]','varchar(50)')
,collegeName = x.n.value('collegeName[1]','VARCHAR(100)')
,collegeCountry = x.n.value('collegeCountry[1]','VARCHAR(20)')
,collegeState = x.n.value('collegeState[1]','CHAR(2)')
,fromDate = x.n.value('fromDate[1]','varchar(30)')
,toDate = x.n.value('toDate[1]','varchar(30)')
,degreeDate = x.n.value('degreeDate[1]','varchar(30)')
,gpaType = x.n.value('gpaType[1]','VARCHAR(20)')
,gradePointAverage = x.n.value('gradePointAverage[1]','DECIMAL(5,3)')
,enteredDegree = x.n.value('enteredDegree[1]','VARCHAR(20)')
FROM
t.VAL_TXT.nodes ('objects.CollegeInfo') as x(n)
) c;
がエラーを受け取ります メッセージ9411、レベル16、状態1、行8 XML PA rsing:セミコロンは
現在の変換エラーを避けるために、データ型を変更しました。それらを変更した後、次のエラーが表示されます。メッセージ9411、レベル16、状態1、行8 XML解析:行1、文字10、セミコロンが予想されます –
@LindseyJacksonはい、表示したいデータに合わせてデータ型を変更する必要がありますあなたはそれを理解できるようにオプションをあなたに与えます。セミコロンが期待される限り、構文の違いを知るためにコードを参照する必要があります。質問を編集して現在の試行や何かを追加すると、私は見てうれしいです。また、あなたはこれを実行しようとしているのですか?これは、あなたがMS SQLでそれを実行していることを前提としています。ここでは、このコードが意図したとおりに機能することを示すためにテスト/再生できるリンクがあります:http://rextester.com/RQV19377 – Matt
あなたの助けを借りて2回目の試しに投稿を編集しました。私はMS SQLでそれを実行しています。私は明らかにセキュリティ上の理由からTABLEのテーブル名を編集しました。いくつかのフィールドにも同じです。 –