将表值函数的多个结果连接到一个表中

时间:2010-12-28 10:25:13

标签: sql-server database sql-server-2008

假设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。我知道我可以使用光标来做,但我想确保没有更简单的解决方案

2 个答案:

答案 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节点中提取值。

<强>更新

MSDN Link

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