【发布时间】:2016-07-30 04:57:26
【问题描述】:
我正在尝试创建一个 SQL 视图,该视图将从表的列中返回子字符串的串联值。
在我的示例中,名为“TrebuchetSettings”的表中有一个标题为“DefDetails”的列,其中包含我需要连接在一起的值的 XML 列表。
DefDetails 列将包含如下值,每条记录:
<Trebuchet>
<FolderSetDef ID="9365da81288308c9c57aba483f83d2469a5da9ecba" Name="ReportDef" Version="1.0" SubType="" Scope="Global" Culture="Invariant" View="(None)">
<Alias />
<Description />
<Owner>934ec7a1701c451ce57f2c43bfbbe2e46fe4843f81</Owner>
<FolderList>
<FolderDef ID="93af31dc1b3238241be33549ba8f8239b377767680" Name="Yearly Reports" ParentID="93af31a36cf8232f44265b40f9a1cd14d1e7000813" Scope="Core" />
<FolderDef ID="93af31a36cf8232f44265b40f9a1cd14d1e7000813" Name="CSM Management Reports" ParentID="Root" Scope="Core" />
</FolderList>
</FolderSetDef>
</Trebuchet>
使用 SQL 语句,我需要查询 TrebuchetSettings 表并返回上面 XML 中“FolderDef”节点内的“名称”字段的串联列表,用“/”字符分隔,FolderDef 的 ID 匹配字符串开头列出的后续FolderDef的ParentID,以便连接结构表示文件夹结构。
由于该表中还有其他类型的记录,我的查询当前包含以下内容,以确定我需要从中提取这些子字符串的记录:
SELECT *
FROM TrebuchetSettings
WHERE DefType = 'FolderSetDef'
AND DefDetails LIKE '%(Folder ID)%'
在上面的示例 SQL 中,文件夹 ID 是一个 42 个字符的 ID,它将与另一个表中的值进行比较,以匹配 XML 中的文件夹定义之一的 ID。
很遗憾,我没有这方面的起始代码集,因为我没有在 SQL 中处理列的子字符串的经验,也不知道从哪里开始。
【问题讨论】:
-
我建议将
Name值移动/复制到单独的列中,并为DefDetails LIKE '%(Folder ID)%'所在的行设置一个标志列。否则运行会很慢。 SQL 不是处理 XML 的最佳工具。
标签: sql sql-server xml substring string-concatenation