我有一个名为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属性,我需要它们进行编辑,所有记录都会有它们,所以它不是那么随机。
感谢您的帮助。
答案 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“拆分”为视图中的列。这就是你要找的东西吗?