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