2011-10-20 11 views
2

私はSQL Server 2008に次のような構造のデータを格納するためのフィージビリティ・スタディをやってる:これはSQL Server 2008にXMLデータを保存するための良い方法ですか?

-MYTABLE

|ID|RECORDS|BRANCH_OFFICE|MONTH|YEAR 

RECORDS列がXMLデータ・タイプを持っており、それは次のようになります。

<visits> 
    <visit id="000112233"> 
    <costumer>Mr. One Costumer</costumer> 
    <date>2011-02-10</date> 
    <employee>MAT</employee> 
    </visit> 
    <visit id="000112234"> 
    <costumer>Mr. Another Costumer</costumer> 
    <date>2011-02-12</date> 
    <employee>MAT</employee> 
    </visit> 
    <visit id="000112235"> 
    <costumer>Mr. Some Costumer</costumer> 
    <date>2011-02-12</date> 
    <employee>MAT</employee> 
    </visit> 
    <visit id="000112236"> 
    <costumer>Mr. Some Costumer</costumer> 
    <date>2011-02-15</date> 
    <employee>MAT</employee> 
    </visit> 
</visits> 

xqueryを使用してxml列をクエリするつもりですが、これはこのデータを格納する良い方法ですか?

2011-10年に発生した訪問のリストを取得するには、「日付」タグと現在の日の差を付けたタグを追加します。どのようにすることができますか?

+0

それは** ** XMLは、[はい、私は**それを格納しますされている場合は** ....非常に構造化され、表形式のデータのように見えます –

+0

。シンプルな昔ながらのテーブルに保管してください。 (セミ/非構造化)XMLデータの保存とクエリが本当に必要な場合は、[ネイティブXMLデータベース](http://en.wikipedia.org/wiki/XML_database#Native_XML_databases)の使用を検討してください。 –

+0

はい私はそれをXMLとして保管しなければなりません。RECORDS列にはXMLのような他の種類の構造が含まれていますが、私が求めたxqueryはどういう意味ですか? SQL Server 2008が必要です。 –

答えて

2

あなたのXMLに対するクエリは、このようなものになる可能性があります。あなたの構造はうまくいくと思います。あなたが必要とする情報を得るために、派手なXMLを行う必要はありません。

declare @T table 
(
    ID int identity primary key, 
    Records xml 
) 

insert into @T values(' 
<visits> 
    <visit id="000112233"> 
    <costumer>Mr. One Costumer</costumer> 
    <date>2011-02-10</date> 
    <employee>MAT</employee> 
    </visit> 
    <visit id="000112234"> 
    <costumer>Mr. Another Costumer</costumer> 
    <date>2011-02-12</date> 
    <employee>MAT</employee> 
    </visit> 
    <visit id="000112235"> 
    <costumer>Mr. Some Costumer</costumer> 
    <date>2011-02-12</date> 
    <employee>MAT</employee> 
    </visit> 
    <visit id="000112236"> 
    <costumer>Mr. Some Costumer</costumer> 
    <date>2011-02-15</date> 
    <employee>MAT</employee> 
    </visit> 
</visits>') 


select T.ID, 
     V.X.value('@id', 'nvarchar(10)') as VisitID, 
     V.X.value('costumer[1]', 'nvarchar(50)') as Costumer, 
     V.X.value('date[1]', 'date') as [Date], 
     V.X.value('employee[1]', 'nvarchar(50)') as Employee 
from @T as T 
    cross apply T.Records.nodes('/visits/visit') as V(X) 

結果:

XMLとして
ID   VisitID Costumer    Date  Employee 
----------- ---------- -------------------- ---------- -------------------- 
1   000112233 Mr. One Costumer  2011-02-10 MAT
1   000112234 Mr. Another Costumer 2011-02-12 MAT
1   000112235 Mr. Some Costumer 2011-02-12 MAT
1   000112236 Mr. Some Costumer 2011-02-15 MAT
関連する問題