【发布时间】:2014-12-13 02:51:49
【问题描述】:
我在 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>
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]
我将使用 C# 作为代码隐藏获取该数据并写入我的 ASP.net 页面中的转发器。
如何修改我的 SQL 查询,以便它获取每个 langAccept 和 insAccept 标记的值(出现多次)。
【问题讨论】:
-
这应该复制行或放入一行(如
English, Spanish)? -
如果我什至可以将它们放在 CSV 的列中,我可以在代码隐藏中操作它们。我认为添加一列并通过 CSV 插入每个事件对我来说是更好的途径。
-
使用逗号分隔符的列值不是一个好主意。这是一个糟糕的数据库设计的例子。相反,您应该寻求一个适当规范化的数据库,从中获取数据会容易得多。
-
因为这是我第一次使用它,我愿意提供建议和帮助:)。几乎这个查询将返回结果,我将在前端显示它作为结果。有时这些标签会出现 10+ 次,那么在一个表中创建 10+ 行有意义吗?
标签: c# asp.net sql-server xml