SQL Server 2005查询XML列数据

时间:2010-12-08 14:59:35

标签: sql-server xml sql-server-2005

我有一个名为People的表,其中包含一个名为xml的数据类型为properties的列。我用它来存储关于每个人的随机信息,基本上允许人们存储将来添加的任何额外数据,而无需重新设计数据库。并非所有人都在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

我知道这是不正确的,但是我收到错误“需要一个单身(或空序列)”,我不太确定是什么问题。

第二个问题是我将几个较旧的数据库合并到一个人列表中,但旧的数据库前端仍然需要访问他们的数据位。我的计划是为每个数据库前端创建一个视图,其中包含特定于其需要的布局,所有这些都链接回主人员表。但是,它们的一些字段现在存储在XML中。有没有办法创建一个视图来更新XML而不会看到xml,因此它的外观和行为就像任何其他表上的视图一样。我希望我能正确解释。对于每个视图,我将有一组特定的XML属性,我需要它们进行编辑,所有记录都会有它们,所以它不是那么随机。

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

你的XQuery应该是:

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

这有帮助??

更新:让其他人更清楚 - 我在/PropertyList/Property[@Name="Class"]表达式周围添加了括号,这样就可以评估可能的值列表,然后是{{括号后将选择该列表的第一个(通常是唯一的)值(作为单例),以便将其转换为[1]字符串。

NVARCHAR(50)

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

更新2:如果你想创建一个视图 - 确定,没有理由不这样做! ; - )

你绝对可以创建类似的东西:

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

并将XML“拆分”为视图中的列。这就是你要找的东西吗?