2010-12-08 20 views
3

propertiesと呼ばれるxmlというデータ型の列を持つPeopleという名前のテーブルがあります。私はこれを使用して、基本的にデータベースの再設計なしに将来追加される余分なデータを各自が格納できるようにする、それぞれの人に関するランダムな情報を格納しました。すべての人がXMLに同じ要素を持つわけではありません。SQL Server 2005クエリXML列データ

CREATE TABLE [dbo].[Person](
[PersonID] [bigint] IDENTITY(1,1) NOT NULL, 
[PersonType] [nvarchar](50) NULL, 
[Title] [nvarchar](5) NULL, 
[Forename] [nvarchar](60) NULL, 
[Surname] [nvarchar](60) NULL, 
[Company] [nvarchar](60) NULL, 
[Properties] [xml] NULL 
) 

XMLの例は次のとおりです。

<PropertyList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Property Name="Class">Class A</Property> 
    <Property Name="CarRegistration">123456</Property> 
    <Property Name="MedicalNotes">None</Property> 
</PropertyList> 

最初の質問は、私は私がに保存された条件に一致するレコードのリストを取得できるようになりますSQLクエリを見つけることができないようですxml。

たとえば、すべてのレコードを取得するには、Class="Class A"を入力します。 「シングルトン(または空のシーケンス)が必要です」

SELECT 
    PersonID, 
    Properties.value('/PropertyList/Property[@Name="Class"][1]','nvarchar(50)') 
FROM Person 

私は、これは間違っている知っているが、私はエラーを取得するには、私は間違っていただきました、非常にわからない:私が試してみました。

2番目の問題は、いくつかの古いデータベースを1人の人物リストに結合しましたが、古いデータベースのフロントエンドは依然としてデータのビットにアクセスする必要があります。私の計画は、ニーズに応じたレイアウトを持つデータベースフロントエンドのビューをすべてメインの人物表に戻して作成することでした。ただし、そのフィールドの一部はXMLに格納されるようになりました。 xmlを見ることなくXMLを更新するビューを作成する方法はありますか?つまり、他のテーブルのビューと同じように見えます。私はそれを正しく説明してくれることを望みます。各ビューには、編集に必要なXMLプロパティの特定のセットがあり、すべてのレコードにはそのようにランダムではありません。

ありがとうございました。

答えて

5

あなたのXQueryは次のようになります。

SELECT PersonID, 
     Properties.value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
FROM dbo.Person 

はその助けをい??

アップデート: - これは値の潜在的なリストに評価され、その後、括弧の後[1]が最初に選択するように私は、/PropertyList/Property[@Name="Class"]表現の周りに括弧を追加しました(とは他人のためにそれをより明確にするために最も頻繁にのみ)値を(そのシングルトンとして)NVARCHAR(50)文字列に変換できるようにします。

value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
     !          ! 

value('/PropertyList/Property[@Name="Class"][1]','NVARCHAR(50)') 

アップデート2と同じませです:ビューを作成したい場合は - 確かに、ではないに理由もなく! ;-)

あなたは間違いのようなものを作成できます:あなたのテーブルから

CREATE VIEW dbo.YourViewName 
AS 
    SELECT 
     PersonID, PersonType, Title, 
     ForeName, Surname, Company, 
     Properties.value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') AS 'Class', 
     Properties.value('(/PropertyList/Property[@Name="CarRegistration"])[1]','NVARCHAR(50)') AS 'CarRegistration', 
     Properties.value('(/PropertyList/Property[@Name="MedicalNotes"])[1]','NVARCHAR(50)') AS 'MedicalNotes' 

をし、あなたのビューに列にXMLを「壊します」。それはあなたが探しているものですか?

+0

これはまさに彼らがすでに試みたことではありませんか? –

+0

@Ash Burlaczenko:** NO !! ** XQuery式に括弧を追加しました(この場合は必須です!)かっこなし(元の投稿)、それは動作しないし、エラーを与える - 私のかっこで、それは動作します - 厳密にチェック! –

+0

@ marc_s:なぜ括弧が違いを生むべきか説明できますか?もちろん、理論的には、Properties列の値が複数の/ PropertyList要素を含むXMLドキュメントの断片である場合、括弧は「Classという名前の最初のプロパティ」と「各PropertyListのClassという名前の最初のプロパティ」の違いを意味します。しかし、各Properties列の値には1つの/ PropertyList要素しかないと仮定すると、違いはありません。実際、彼の例では、 '' Class ''という名前のPropertyが1つしかないので、 '[1]'は全く違いを生むべきではありません。 – LarsH

関連する問題