Sea*_*dge 2 c# xml sql-server asp.net
我在SQL表列中有以下XML数据:
<root>
<Physicians>
<name></name>
<picture></picture>
<gender></gender>
<langAccept>English</langAccept>
<langAccept>Spanish</langAccept> (can appear more times)
<insAccept>Aetna</insAccept>
<insAccept>BCBS</insAccept> (can appear more times)
<specialty></specialty>
<specialty2></specialty2>
<specialty3></specialty3>
</Physicians>
</root>
Run Code Online (Sandbox Code Playgroud)
该langAccept和insAccept可以出现多次,也没有办法知道多少倍.
我有以下SQL查询,目前没有考虑'langAccept'和'insAccept'标签:
DECLARE @strProvider varchar(200)
SET @strProvider = '' --The Provider DropDownList
DECLARE @strSpecialty varchar(200)
SET @strSpecialty = '' --The Specialty DropDownList
DECLARE @strLocation varchar(200)
SET @strLocation = '' --The Location DropDownList
DECLARE @strGender varchar(200)
SET @strGender = '' --The Gender DropDownList
DECLARE @strInsurance varchar(200)
SET @strInsurance = '' --The Insurance DropDownList
DECLARE @strLanguage varchar(200)
SET @strLanguage = '' --The Language DropDownList
SELECT
[content_title] AS [Physician Name]
, [content_status] AS [Status]
, CAST([content_html] AS XML).value('(root/Physicians/picture/img/@src)[1]','varchar(255)') AS [Image]
, dbo.usp_ClearHTMLTags(CONVERT(nvarchar(600), CAST([content_html] AS XML).query('root/Physicians/gender'))) AS [Gender]
, CAST([content_html] AS XML).query('/root/Physicians/OfficeLocations/office1/a') AS [Office1]
, CAST([content_html] AS XML).query('/root/Physicians/OfficeLocations/office2/a') AS [Office2]
, CAST([content_html] AS XML).query('/root/Physicians/OfficeLocations/office3/a') AS [Office3]
, CAST([content_html] AS XML).query('/root/Physicians/OfficeLocations/office4/a') AS [Office4]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty/a') AS [Specialty1]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty2/a') AS [Specialty2]
FROM
[MYDB].[dbo].[content]
WHERE
[folder_id] = '188'
AND
(content_html LIKE '%<gender>%'+ @strGender+'%</gender>%')
AND
(content_html LIKE '%'+@strSpecialty+'%')
AND
(content_html LIKE '%'+@strLocation+'%')
AND
(content_status = 'A')
ORDER BY
[content_title]
Run Code Online (Sandbox Code Playgroud)
我将使用C#作为代码隐藏,将该数据写入我的ASP.net页面中的转发器.
如何修改我的SQL查询,使其获取每个langAccept和insAccept标记的值(显示的次数).
您可以处理可能重复的任意数量的节点 - 但请注意,这将始终为单个条目创建多个行<Physician>.
试试这个:
DECLARE @Content TABLE (ID INT NOT NULL, XmlDAta XML)
INSERT INTO @content VALUES(1, '<root>
<Physicians>
<name>Dr. Excellent</name>
<picture></picture>
<gender>Male</gender>
<langAccept>English</langAccept>
<langAccept>Spanish</langAccept>
<insAccept>Aetna</insAccept>
<insAccept>BCBS</insAccept>
<specialty></specialty>
<specialty2></specialty2>
<specialty3></specialty3>
</Physicians>
</root>')
SELECT
ID,
PhysicianName = XC.value('(name)[1]', 'varchar(50)'),
Gender = XC.value('(gender)[1]', 'varchar(50)'),
LangSpoken = XLang.value('.', 'varchar(20)'),
InsAccepted = XIns.value('.', 'varchar(50)')
FROM
@Content
CROSS APPLY
XmlData.nodes('/root/Physicians') AS XT(XC)
CROSS APPLY
XC.nodes('langAccept') AS XT2(XLang)
CROSS APPLY
XC.nodes('insAccept') AS XT3(XIns)
Run Code Online (Sandbox Code Playgroud)
通过在节点.nodes()上langAccept和insAccept内部使用on <Physician>,您将获得所有已定义的值 - 但最终会为单个<Physican>节点提供几个关系行:

更新:要从您自己的现有表中获取数据,请使用以下命令:
SELECT
ID,
PhysicianName = XC.value('(name)[1]', 'varchar(50)'),
Gender = XC.value('(gender)[1]', 'varchar(50)'),
LangSpoken = XLang.value('.', 'varchar(20)'),
InsAccepted = XIns.value('.', 'varchar(50)')
FROM
[MyDB].[dbo].Content
CROSS APPLY
CAST(content_html AS XML).nodes('/root/Physicians') AS XT(XC)
CROSS APPLY
XC.nodes('langAccept') AS XT2(XLang)
CROSS APPLY
XC.nodes('insAccept') AS XT3(XIns)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |