объединить несколько результатов табличных функций в одну таблицу - PullRequest
0 голосов
/ 28 декабря 2010

Предположим, в базе данных 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 ]

1 голос
/ 28 декабря 2010

Вам не нужна табличная функция, используйте XPath для извлечения этих значений непосредственно в операторе SELECT

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
0 голосов
/ 28 декабря 2010

Ответ Orangepips кажется подходящим решением для вашей проблемы.

Но, если взять дословно вопрос: ДА , в SQL-Server 2005+ есть способ создать подходящую статистическую функцию с использованием CLR.

Но, правда, это немного сложно.

Вы должны скомпилировать код c #, который вы найдете по адресу Вызов определяемых пользователем агрегатных функций CLR .

Мне удалось запустить этот пример, но я предпочитаю использовать решения Orangepips xpath, когда это подходит, потому что это просто T-SQL и не требует

sp_configure 'clr enabled',1
reconfigure
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...