假设SqlServer 2008数据库中有这样的表:
CREATE TABLE [dbo].[Test] (
[TableId] [int] IDENTITY(1,1) NOT> NULL,
[Data] [xml] NOT NULL
)
我也有这样的表值函数来解析我的表中的列Data
:
ALTER FUNCTION [dbo].[fnParseTable] (@header XML)
RETURNS @parsedTable TABLE (
[Type] NVARCHAR(50),
[Value] NVARCHAR(50)
)
AS BEGIN
--parse xml here
RETURN
END
我可以为表格的每一列连接此函数的所有结果吗?
我需要这样的东西:
SELECT UNION fnParseTable(Data) FROM dbo.Test
PS。我知道我可以使用光标来做,但我想确保没有更简单的解决方案
答案 0 :(得分:1)
您不需要表值函数,请使用XPath to extract these values directly in a SELECT statement
SELECT
Data.query('data(/xpath/to[@your="type"])') AS type,
Data.query('data(/xpath/to[@your="value"])') AS value
FROM Test
/* JOINs, WHERE HAVING, GROUP BY and/or ORDER BY clauses */
query()
执行XPath表达式,而data()
从生成的XML节点中提取值。
<强>更新强>
DECLARE @testTable TABLE(
XmlData XML
)
INSERT INTO @testTable (XmlData)
VALUES ('<row><node><key>key11</key><value>value11</value></node><node><key>key12</key><value>value12</value></node></row>')
INSERT INTO @testTable (XmlData)
VALUES ('<row><node><key>key21</key><value>value21</value></node><node><key>key22</key><value>value22</value></node></row>')
INSERT INTO @testTable (XmlData)
VALUES ('<row><node><key>key31</key><value>value31</value></node><node><key>key32</key><value>value32</value></node></row>')
SELECT
nref.value('key[1]', 'nvarchar(50)') AS [key],
nref.value('value[1]', 'nvarchar(50)') AS value
FROM @testTable CROSS APPLY XmlData.nodes('//node') AS R(nref)
结果
key11 value11
key12 value12
key21 value21
key22 value22
key31 value31
key32 value32
答案 1 :(得分:0)
Orangepips的回答似乎是解决问题的充分办法。
但是逐字地提出问题:是有一种方法可以在SQL-Server 2005 +中使用CLR创建合适的聚合函数。
但无可否认,这有点复杂。
你需要编译c#代码,你可以在Invoking CLR User-Defined Aggregate Functions找到。
我成功运行了这个例子,但我更喜欢在适当时使用orangepips xpath解决方案,因为它只是T-SQL并且不需要
sp_configure 'clr enabled',1
reconfigure