2017-11-17 5 views
0

私はアプリケーションからデータを取り込むデータベースを扱っています。データはフィールドに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&apos;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:セミコロンは

答えて

0
DECLARE @TableWithXMLAsVarchar AS TABLE (XMLasVarchar VARCHAR(MAX)) 
INSERT INTO @TableWithXMLAsVarchar VALUES ('<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&apos;s</enteredDegree> 
</objects.CollegeInfo>') 


SELECT * 
FROM 
    (
     SELECT 
      XMLColumn = CAST(XMLasVarchar AS XML) 
     FROM 
      @TableWithXMLAsVarchar 
    ) t 
    CROSS APPLY 
    (
     SELECT 
      collegeOrgId = x.n.value('collegeOrgId[1]','INT') 
      ,useCollegeOrgId = x.n.value('useCollegeOrgId[1]','INT') 
      ,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]','DATE') 
      ,toDate = x.n.value('toDate[1]','DATE') 
      ,degreeDate = x.n.value('degreeDate[1]','DATE') 
      ,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.XMLColumn.nodes ('objects.CollegeInfo') as x(n) 
    ) c 

を期待行1、文字10は、基本的には、一種の正しい考えを持っていたが、代わりに直接値を選択するので、あなたは、ノードから値を選択する必要があります。しかし、このデータはテーブルの中にあるため、実際にはもう少しのことがあります。まず、XMLとして列をキャストしなければなりませんが、FROMステートメントでその列をキャストできないので、Common Table Expression [CTE]または別名Derived Tableを使用して行えます。その後、すべての列を取得するにはCROSS/OUTER APPLYできます。

+0

現在の変換エラーを避けるために、データ型を変更しました。それらを変更した後、次のエラーが表示されます。メッセージ9411、レベル16、状態1、行8 XML解析:行1、文字10、セミコロンが予想されます –

+0

@LindseyJacksonはい、表示したいデータに合わせてデータ型を変更する必要がありますあなたはそれを理解できるようにオプションをあなたに与えます。セミコロンが期待される限り、構文の違いを知るためにコードを参照する必要があります。質問を編集して現在の試行や何かを追加すると、私は見てうれしいです。また、あなたはこれを実行しようとしているのですか?これは、あなたがMS SQLでそれを実行していることを前提としています。ここでは、このコードが意図したとおりに機能することを示すためにテスト/再生できるリンクがあります:http://rextester.com/RQV19377 – Matt

+0

あなたの助けを借りて2回目の試しに投稿を編集しました。私はMS SQLでそれを実行しています。私は明らかにセキュリティ上の理由からTABLEのテーブル名を編集しました。いくつかのフィールドにも同じです。 –

関連する問題