2016-11-16 11 views
0

約60個のテーブルに適用されたトリガーによって作成された行を1つの監査テーブルに格納しています。 SQL Serverでxml列から行を再作成する2016

私は行が保存されている xmlカラムを持っている。私はすべての表の行ので、格納されたXMLの構造を理解していない照会の時点で(ランダムXMLデータから行を再作成するにはどうすればよい

(この場合はノードが)異なる列と異なる)

1つのエントリは、この

<Log> 
    <id>2</id> 
    <text>232323</text> 
    <text1>2323</text1> 
    <text2>2323</text2> 
    <text3>2323</text3> 
    <text4>2323</text4> 
    <text5>2323</text5> 
</Log> 

ように見えることができ、別のエントリは、この

ようになり
<Log> 
    <id>3</id> 
    <tableName>ExcludeTables</tableName> 
</Log> 

今、私はidは= 50私はあなたの助けを

おかげで

答えて

1

SQL Serverが動的にサポートしていない通常のSQL Serverのデータ行形式の列と値を見たい場所をログ表から選択を行うとき作成された列別名。未知の列名でこれを達成する唯一の方法は、動的に作成されたSQLです。

この例では、モックアップテーブルを作成し、2行を挿入します。

最初の行はノードをキーと値のペアとして返します。

DECLARE @tbl TABLE(ID INT, SomeValue VARCHAR(100),AuditColumn XML) 
INSERT INTO @tbl VALUES 
(1,'Row 1' 
,N'<Log> 
    <id>2</id> 
    <text>232323</text> 
    <text1>2323</text1> 
    <text2>2323</text2> 
    <text3>2323</text3> 
    <text4>2323</text4> 
    <text5>2323</text5> 
</Log>') 
,(2,'Row 2' 
,N'<Log> 
    <id>3</id> 
    <tableName>ExcludeTables</tableName> 
</Log>'); 

- この

が--The結果はあなたが

DECLARE @id INT=1; 

を探しているIDです。

二つ目は、あなたがそれを必要として結果を返すように動的にクエリを作成しますキーと値のペアのリスト

SELECT ID 
     ,SomeValue 
     ,nd.value('local-name(.)','nvarchar(max)') AS NodeName 
     ,nd.value('.','nvarchar(max)') AS NodeValue 
FROM @tbl AS t 
CROSS APPLY t.AuditColumn.nodes('/Log/*') A(nd) 
WHERE [email protected]; 

--The結果

--dynamically作成10
+----+-----------+----------+-----------+ 
| ID | SomeValue | NodeName | NodeValue | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | id  | 2   | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | text  | 232323 | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | text1 | 2323  | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | text2 | 2323  | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | text3 | 2323  | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | text4 | 2323  | 
+----+-----------+----------+-----------+ 
| 1 | Row 1  | text5 | 2323  | 
+----+-----------+----------+-----------+ 

声明

DECLARE @cmd NVARCHAR(MAX)= 
(
    SELECT N'SELECT ' 
      + STUFF(
      (
       (
       SELECT ',''' + nd.value('.','nvarchar(max)') + ''' AS ' + QUOTENAME(nd.value('local-name(.)','nvarchar(max)')) 
       FROM @tbl AS t 
       CROSS APPLY t.AuditColumn.nodes('/Log/*') A(nd) 
       WHERE [email protected] 
       FOR XML PATH(''),TYPE).value('.','nvarchar(max)') 
       ),1,1,'' 
      ) 
); 

- この文

PRINT @cmd; 

SELECT '2' AS [id],'232323' AS [text],'2323' AS [text1],'2323' AS [text2],'2323' AS [text3],'2323' AS [text4],'2323' AS [text5] 

である - そしてこれは、その実行

EXEC (@cmd); 

+----+--------+-------+-------+-------+-------+-------+ 
| id | text | text1 | text2 | text3 | text4 | text5 | 
+----+--------+-------+-------+-------+-------+-------+ 
| 2 | 232323 | 2323 | 2323 | 2323 | 2323 | 2323 | 
+----+--------+-------+-------+-------+-------+-------+ 
+0

はそんなにありがとう最高です答え: –

+0

@AnatolyTrofimov私に1つのヒントを許可してください:それは非常に親切ですay *ありがとうございます - 最善の答え*、それは答えの投票カウンタの下の受け入れチェックにチェックを入れるのは親切です。これは、1)この問題を解決済みとマークします。2)フォロワーが最良の解決策を見つけるのをより簡単にします。3)回答者にポイントを払います。あなた自身が15ポイントの国境を越えたら、さらにあなたは貢献に投票するように求められます。これは、ありがとうと言います。ハッピーコーディング! – Shnugo

+0

問題はない、ごめんなさい申し訳ありませんでした –

関連する問題