我有一張旨在跟蹤更改的表格。將XML數據轉換爲行和列
CREATE TABLE ChangeTracker
(
ChangeId BIGINT NOT NULL identity(1, 1) PRIMARY KEY,
ChangeDate DATETIME NOT NULL DEFAULT getdate(),
Changes VARCHAR(max) NOT NULL DEFAULT ''
)
在Changes
的數據是以下格式:
<span class="fieldname">AssignedTo</span>
<span class="oldvalue">user1</span>
<span class="newvalue">user2</span>
<br />
<span class="fieldname">Attachments</span>
<br />
<span class="fieldname">Status</span>
<span class="oldvalue">new</span>
<span class="newvalue">open</span>
<br />
<span class="fieldname">Priority</span>
<span class="oldvalue">low</span>
<span class="newvalue">high</span>
<br />
...
注意,一些變化有字段名,OLDVALUE,NEWVALUE對,而一些具有唯一字段名。所有更改也由<br />
標記分隔。
所以,當我想在一個特定的字段名的變化(比如狀態),我可以使用下面的查詢可以這樣做:
SELECT * FROM
(
SELECT ChangeId,
ChangeDate,
TransDesc.value('(/root/span[@class="fieldname"]/text())[1]', 'varchar(255)') as FieldName,
TransDesc.value('(/root/span[@class="oldvalue"]/text())[1]', 'varchar(255)') AS OldValue,
TransDesc.value('(/root/span[@class="newvalue"]/text())[1]', 'varchar(255)') AS NewValue
FROM (
SELECT *, TransDesc = CAST('<root>' + SUBSTRING(ChangeA, 0, CHARINDEX('<br />', ChangeA)) + '</root>' AS XML)
FROM
(
SELECT *, ChangeA = SUBSTRING(Changes, CHARINDEX('<span class="fieldname">Status</span>', Changes), 4000)
FROM ChangeTracker
WHERE CHARINDEX('<span class="fieldname">Status</span>', Changes) > 0
) TTX
) TT
) x
這給了我以下結果:
ChangeId | ChangeDate | FieldName | OldValue | NewValue
————————————————————————————————————————————————————————————————————
1 | 2016-06-28 18:37:24.403 | Status | new | open
現在我想要一個查詢(創建一個視圖)來獲取所有更改。所以輸出看起來是這樣的:
ChangeId | ChangeDate | FieldName | OldValue | NewValue
————————————————————————————————————————————————————————————————————
1 | 2016-06-28 18:37:24.403 | AssignedTo | user1 | user2
1 | 2016-06-28 18:37:24.403 | Attachments | NULL | NULL
1 | 2016-06-28 18:37:24.403 | Status | new | open
1 | 2016-06-28 18:37:24.403 | Priority | low | high
感謝。這真的很有幫助。 –