Jam*_*mmy 3 xml sql-server 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
)
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属性,我需要它们进行编辑,所有记录都会有它们,所以它不是那么随机.
谢谢你的帮助.
你的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到视图中的列.这就是你要找的?
归档时间: |
|
查看次数: |
2188 次 |
最近记录: |