2017-02-02 7 views
0

varchar(2056)列を持つ古いSQL Serverテーブルがあり、各行にXMLの慎重な「要素」が含まれています。 T-SQLを使用してこれらを実際のXMLに選択する方法はありますか?個別のvarchar要素からxmlを選択するにはどうすればよいですか?

これはあなたに私が扱っていますかのアイデアを与えるだろう。

declare @xmlTable table(
    Value varchar(2056) 
) 

insert into @xmlTable 
values ('<Root>'), 
     (' <Child id="1">'), 
     (' <Name>Sam</Name>'), 
     (' </Child>'), 
     (' <Child />'), 
     ('</Root>') 

問題は各要素がテーブル内に独自の行にある、とのオープン/クローズのタグが離れていくつかの行にできることです。私はXMLに変換しようとしましたが、各行が有効なxmlではないので、これは失敗します。私も古い "select column to CSV using for XML"トリック(私がキャストできる文字列を作成する)を試みましたが、それは私の ">"を "& gt;に変換します"

私はSQL Server 2012を使用しています。この特定のテーブルには、650個以上の行が560個の "ドキュメント"にまたがっています。

select Value 
from @xmlTable 
for xml path(''), type 

などのように言いたいことがあります。クエリ可能なXMLの素敵なチャンクを返します。

ありがとうございます!

+0

おっと!私は2014年ではなくSQL 2012を使用しています。 –

答えて

1

はこのようにそれを試してみてください:文字列と含まれているエスケープエンティティと

declare @xmlTable table(
    Value varchar(2056) 
) 

insert into @xmlTable 
values ('<Root>'), 
     (' <Child id="1">'), 
     (' <Name>Sam</Name>'), 
     (' </Child>'), 
     (' <Child />'), 
     ('</Root>'); 

SELECT CAST 
(
    (
    SELECT Value AS [*] 
    FROM @xmlTable 
    FOR XML PATH(''),TYPE 
    ).value('.','nvarchar(max)') 
AS XML); 

あなたの問題は、value() -method ,TYPEを使用し、この後に解決されます。そうすることで、すべてのエスケープ文字が暗黙的に再エスケープされます。

+0

はい、これは機能します!少なくともサンプルデータでは、すぐに大きなデータを試してみます。大きなデータはすべてCDATA []のものです。うまくいけば問題は発生しません。私は決して「*」として見たことがありません。それは正確に何ですか? –

+0

@ emery.noel 1) 'CDATA'セクションは妨害されませんが、通常はエスケープされたセクション*に変換されます。これは違いをもたらすべきではありません... 2) '[*]'は、名前のない列を強制する多くの方法の1つです。それ以外の場合、生成されたXMLには名前付き要素が含まれます。3)受け入れのためのThx!ほんの少しのヒント:これが好きなら、あなたは答えにさらに投票するかもしれません。投票と受け入れは、SOの2つの異なるステップです...ハッピーコーディング! – Shnugo

+0

Lolあまりにも速くクリックしました。今投票しました。 CDATAを取り除くことは単なる追加ボーナスです。これは私たちの最新の "ドキュメント"に完全に対応しています...今すぐすべてを一度に入手できるかどうかを確認してください! もう一度おねがいします! –

関連する問題