2

私の質問は説明するのが難しいので、私はあなたに視覚を与えましょう。まず、次のビューを使用します。 SQLビュー

列にXMLがありAuditValueます。1つおきの列を属性としてXML列に追加したいと思います。したがって、私の最初の行は次のようになります。

<row ManufacturerID="6" 
     ManufacturerName="AMES999" 
     IsDeleted="0" Concurrency="AAAAAAABTAk=" 
     EntryID="1" 
     TableName="Manufacturers" 
     AuditDate="2013-01-30 15:48:24.69" ChangeType="U"/>

これを動的に実行したいと思います。意味的には、次のことを意味します。AuditValue列を除くビュー内のすべての列について、その列を属性としてAuditValue列XMLに追加します。

私はほとんどの場合SQLバカです。私は基本を知っていますが、それはそれについてです。助けていただければ幸いです。私が提供できる、または提供する必要のある情報があれば、私に知らせてください。必要なものは何でも提供させていただきます。

4

1 に答える 1

1

クエリ内の既存のノードに属性を追加する方法が見つかりませんでした。もちろん、テーブルから一時テーブルを作成し、一時テーブルのXMLを変更して、一度に1つの属性を追加することもできます。

もう1つのオプションは、これが難しいという事実を受け入れて、すべてのデータを含むが、希望どおりの方法ではないXMLを作成することを決定することです。たとえば、このクエリ。

select *
from YourTable
for xml raw

このようなXMLを提供します。

<row EntryID="1" TableName="Manufacturers" AuditDate="2013-01-30T15:48:24.690" ChangeType="U">
  <AuditValue>
    <row ManufacturerID="6" ManufacturerName="AMES999" IsDeleted="0" Concurrency="AAAAAAABTAk=" />
  </AuditValue>
</row>

またはあなたはこれを使うことができます

select EntryID as '@EntryID',
       TableName as '@TableName',
       AuditDate as '@AuditDate',
       ChangeType as '@ChangeType',
       AuditValue as '*'
from YourTable
for xml path('row')

XMLを取得するには

<row EntryID="1" TableName="Manufacturers" AuditDate="2013-01-30T15:48:24.690" ChangeType="U">
  <row ManufacturerID="6" ManufacturerName="AMES999" IsDeleted="0" Concurrency="AAAAAAABTAk=" />
</row>

これで本当に醜くなる準備ができているなら、XMLと文字列操作の組み合わせを試すことができます。

select cast(replace(cast(AuditValue as nvarchar(max)), '/>', '') +
       stuff(cast((
                  select EntryID, TableName, AuditDate, ChangeType
                  for xml raw, type
                  ) as nvarchar(max)) ,1 , 4, '') as xml) as AuditValue
from YourTable

結果:

<row ManufacturerID="6" 
     ManufacturerName="AMES999" 
     IsDeleted="0" 
     Concurrency="AAAAAAABTAk=" 
     EntryID="1" 
     TableName="Manufacturers" 
     AuditDate="2013-01-30T15:48:24.690" 
     ChangeType="U" />

SQLフィドル

于 2013-01-31T21:39:59.967 に答える