2016-04-19 7 views
2

XML(SQL)を初めて使用し、XML文字列を別のサーバーのフィールドに渡すストアドプロシージャを作成するように求められました。 FOR XML RAWを使用してXML文字列を取得できますが、すべてのレコードで1行が取得され、個々の行データのみを返すことはできません。 私のクエリが100の行を持っている場合、結果を100行返す必要があります。今はすべてのレコードで1行を取得します。 XML文字列に行データのみを含め、すべての行に文字列全体を含めることはできません。FOR XMLを使用してXML文字列を値として渡します。

SELECT indv_hrn as 'MRN' 
FROM Members_rawdata mr (nolock) 
inner join Members m (nolock)on mr.memberrecid = m.MemberRecID 
inner join Importfile i (nolock)on m.importfileid = i.importfileid 
WHERE m.importFileID = 83598 and m.Barcode is not null 
FOR XML RAW ('INDEX'),ELEMENTS 
+1

XMLの作成をより詳細に制御できる 'FOR XML PATH()'を使う方が良いでしょう。また、小さなサンプルのテーブルと期待される出力にいくつかのサンプルデータを提供してください。 – Shnugo

+0

こんにちはJMunoz!あなたがここに新しい人として:ようこそ!この質問はまだ開いていますか?さらに助けが必要ですか?この質問が解決された場合は、最も良いと思われる回答の投票カウンターの下で受け入れ確認をチェックすることが非常にうまくいくでしょう。そして、私自身の懸念事項:SOに答えているほとんどの専門家が評判のポイントに飢えているという事実に気をつけてください。 [これを読んでください:誰かの回答](http://stackoverflow.com/help/someone-answers)。 – Shnugo

答えて

1

FOR XMLは、結果セットごとに1つのXMLドキュメントを生成します。サブクエリは、各行に個別のXML文書を生成するために使用することができます。

SELECT (SELECT indv_hrn AS MRN FOR XML PATH ('INDEX'), TYPE) AS [XML] 
FROM Members_rawdata mr (NOLOCK) 
INNER JOIN Members m (NOLOCK) ON mr.memberrecid = m.MemberRecID 
INNER JOIN Importfile i (NOLOCK) ON m.importfileid = i.importfileid 
WHERE m.importFileID = 83598 AND m.Barcode IS NOT NULL 
+0

この答えは - uhm - 10年遅れです:-)文字列の連結によってXMLを生成する必要は全くありません。 T-SQLは、ネームスペース、禁止された文字の暗黙的なエンコーディング、日付形式、およびこれらすべてのものを含むXMLをきれいに簡単に構築するための本当に素晴らしいサポートを提供します... – Shnugo

+0

私はあなたの答えを最後まで読んだので、 ...あなたはあなたがそれを行う方法を知っていることを示していますが、あなたは間違った危険なアプローチを提案しています。コードが機能するかもしれません。それは、いくつかの生産的な環境で実装されます。そしてしばらくして、禁じられた文字を持つ最初の 'indv_hrn'があります。あなたはこの列のデータ型がわからない... – Shnugo

+1

@Shnugo OK。撮影ポイント。 –

2

この答えは、表の行のうち、行方向のXMLを取得するためのアプローチを示しています

DECLARE @tbl TABLE(col1 INT, col2 DATETIME, col3 VARCHAR(100)); 
INSERT INTO @tbl VALUES 
(1,GETDATE(),'test easy') 
,(1,{ts'2016-01-01 23:59:00'},'test with <&> some evil '); 

SELECT (SELECT col1,col2,col3 FOR XML PATH('rowData'),TYPE) 
FROM @tbl 

結果

<rowData><col1>1</col1><col2>2016-04-21T15:35:24.460</col2><col3>test easy</col3></rowData> 
<rowData><col1>1</col1><col2>2016-01-01T23:59:00</col2><col3>test with &lt;&amp;&gt; some evil </col3></rowData> 

Btw:どこでもNOLOCKを使用しています。あなたが本当によくを知らない場合!ここでは何が起こっているのでしょうか、これと同封のリンクを読むことができます:NOLOCK HINTS IN REPORT Stored Procedures

関連する問題