1

有没有办法在 SQL Server 中执行类似(不支持的)xquery tokenize 之类的操作?

我有:

<WITS:foo>
 <WITS:bars>
  <bar details="name=theName;value=theValue" other="false" stuff="true">
  </bar>
 </WITS:bars>
 <WITS:bars notThis="oneIdontwant">
  <bar></bar>
 </WITS:bars>
</WITS:foo>

我想拔出来theName。我能来的最接近的是name=theName;value=theValue通过

SELECT
 x.query('
  distinct-values(
   for $name in data(//WITS:foo/WITS:bars[not (@notThis)]/WITS:bar[@details="name"))
   return $name
  )'
)
FROM (SELECT CAST(xmlColumn AS XML) x FROM blah Where blahblah) y

到目前为止,看起来我很不走运,因为这一切都在 SQL Server 2005 上运行,并且从msdn看来,唯一可以使用字符串的是列出的四个函数(没有索引或其他选项)。

现在我在事后进行解析,但我想知道是否还有其他方法可以完成服务器端。

4

2 回答 2

2

前提是您能够获得name=theName;value=theValue. 您可以使用 TSQL XML 将项目拆分为行。使用下面的查询。

declare @xml xml
SET @xml = N'<root><r>' + replace('name=theName;value=theValue',';','</r><r>') + '</r></root>'
SELECT t.value('.','NVARCHAR(20)') AS [delimited items] FROM @xml.nodes('//root/r') AS a(t)

从这里,您可以重做相同的过程来拆分name=theName.

于 2013-01-11T05:41:29.163 回答
0

您需要使用以下字符串操作:

SUBSTRING - 返回字符、二进制、文本或图像表达式的一部分。

CHARINDEX - 返回字符串中指定表达式的起始位置。

请注意,这些链接指的是 SQL Server 2005 函数。

我相信使用 CHARINDEX 和 SUBSTRING 将是最简单的解决方案。另一种方法是使用正则表达式,但即使在最新版本中也不能很好地支持它们,您将需要使用 CLR 过程 - 对于这样的示例任务来说太复杂了。

于 2013-01-04T07:05:29.803 回答