SQL Server 2005查询XML列数据

Jam*_*mmy 3 xml sql-server sql-server-2005

我有一个名为表People与数据类型的列xmlproperties.我用它来存储关于每个人的随机信息,基本上允许人们存储将来添加的任何额外数据,而无需重新设计数据库.并非所有人都在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
)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

第一个问题是我似乎无法找到一个SQL查询,它将允许我获取与xml中存储的条件匹配的记录列表.

例如,我将如何得到所有记录Class="Class A".我试过了 :

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

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

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

谢谢你的帮助.

mar*_*c_s 5

你的XQuery应该是:

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

这有帮助吗?

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

value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
       !                                     !
Run Code Online (Sandbox Code Playgroud)

一样的

value('/PropertyList/Property[@Name="Class"][1]','NVARCHAR(50)') 
Run Code Online (Sandbox Code Playgroud)

更新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'
Run Code Online (Sandbox Code Playgroud)

从您的表中"分解"XML到视图中的列.这就是你要找的?