2010-12-28 17 views
0

のは、の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:

私はこのようなものが必要。私は、カーソルを使用してそれを行うことができます知っているが、私は、簡単に解決

答えて

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 
+0

を必要とされないので\t Data.query( '/パス')SELECT 、私はその一例を実行することに成功しましたが、私はときに適しorangepips XPathのソリューションを使用することを好みます.value( '。[1]'、 'nvarchar(100)')ASタイプ \t FROM Test。このSELECTの 結果はこのようなものです:だから row1Data1row1Data2row1Data3 row1Data2row2Data2row2Data3 row1Data3row3Data2row3Data3 、それは単なる一例行のXMLとしたい出力を提供する場合、私はあなたがあなたのより良い答えを与えることができ – Egor4eg

+0

文字列の値を連結します。 – orangepips

+0

このサイトではxmlの投稿は許可されていません。 Googleのオンラインドキュメントhttps://docs.google.com/document/d/1UzHz3_qb2klJJvJM9l6IoUAuxpQlm8q8m475_R_zujg/edit?hl=en を作成しました。ここで私が期待している結果は次のとおりです。https://spreadsheets.google.com/ccc?key= 0AlLEbQbwDYKNdHNuWXlvUFBMTjR2ZGRBVzdqWmNzTUE&hl = en。 (私はあなたがGoogleアカウントを持っていることを願って) – Egor4eg

0

Orangepips答えはあなたの問題の適切な解決策です。

ただし、質問をそのまま受け入れる:YES SQL Server 2005以降のCLRを使用して適切な集計関数を作成する方法があります。

しかし、確かに少し複雑です。

Invoking CLR User-Defined Aggregate FunctionsにあるC#コードをコンパイルする必要があります。

それだけでT-SQLウントは何

sp_configure 'clr enabled',1 
reconfigure 
+1

ありがとうございます。しかし、この解決策は私にとってはあまりにも醜いです。 CURSORを実装するよりも複雑です – Egor4eg

関連する問題