Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将表值函数的多个结果连接到一个表中_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

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

Sql server 将表值函数的多个结果连接到一个表中,sql-server,database,sql-server-2008,Sql Server,Database,Sql Server 2008,假设SqlServer 2008数据库中存在这样的表: CREATE TABLE [dbo].[Test] ( [TableId] [int] IDENTITY(1,1) NOT> NULL, [Data] [xml] NOT NULL ) 我还有这样的表值函数来解析表中的列数据: ALTER FUNCTION [dbo].[fnParseTable] (@header XML) RETURNS @parsedTable TABLE ( [Type]

假设SqlServer 2008数据库中存在这样的表:

 CREATE TABLE [dbo].[Test] (    
  [TableId] [int] IDENTITY(1,1) NOT> NULL, 
  [Data] [xml] NOT NULL 
)
我还有这样的表值函数来解析表中的列数据:

 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

另外,我知道我可以使用游标来完成,但我想确保没有任何更简单的解决方案

您不需要表值函数,请使用

查询执行XPath表达式,而数据从结果XML节点提取值

更新


你的答案似乎是解决你问题的适当办法

但是逐字回答这个问题:是的,有一种方法可以在SQLServer2005+中使用CLR创建合适的聚合函数

但不可否认,这有点复杂

你必须编译c代码,你可以在

我成功地运行了这个示例,但我更喜欢在合适的时候使用orangepips的xpath解决方案,因为它只是T-SQL,不需要任何代码

sp_configure 'clr enabled',1
reconfigure

从测试中选择数据。查询'/path'。值'[1]','nvarchar100'作为类型。此选择的结果如下:row1Data1row1Data2row1Data3 row1Data2row2Data2row2Data3 Row1Data3 Row3Data2Row3Data3因此,它只是将值串联在字符串中。如果为行和所需的输出提供示例XML,您能否给出更好的答案。此站点不允许在帖子中使用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
sp_configure 'clr enabled',1
reconfigure