2012-10-29 61 views
1

我正在運行SQL Server 2008 R2,並且有一個表來審計更新語句。在SQL Server中查詢XML列

create table STG_Participant_16_Month 
(
Serial     int, 
ID      varchar(10), 
StartTime    datetime, 
FinishTime    datetime, 
ChildID     varchar(10), 
childIndex    int, 
Record_State   varchar(15), 
Duplicate_flag   varchar(1) 
); 

當表X被更新時,將記錄插入審計表:

select * 
into STG_Participant_16_Month_AUDIT 
from STG_Participant_16_Month; 

alter table STG_Participant_16_Month_AUDIT 
add audit_user      varchar(30), 
    audit_action      varchar(1), 
    audit_date      datetime, 
    columns_updated     xml; 

我創造了紀錄,並做一個更新:如下

insert into STG_Participant_16_Month 
(Serial, ID, StartTime, FinishTime, ChildID, childIndex, 
    Record_State, Duplicate_flag) 
values 
( 90, 'ID', getdate(), getdate(), 'ChildID', 1, 
    'LOADED', 'N'); 

update STG_Participant_16_Month set serial=99, ID='xx', childIndex=99 where serial=90; 

我看到輸出:

<Fields> 
    <Field Name="Serial" /> 
    <Field Name="ID" /> 
    <Field Name="childIndex" /> 
</Fields> 

如何創建一個只顯示文本值的查詢?

Serial 
ID 
childIndex 
+0

輸出是: <字段名稱= 「串行」/> <字段名稱= 「ID」/> <字段名稱=」 childIndex「/> iceaxe101

回答

0

如果這是您的輸出,那麼它看起來像您的觸發器沒有正確填充XML文件;我試圖猜測你的輸出可能是什麼樣子,建成一個XQuery SQL語句來演示:

DECLARE @t TABLE (x XML) 

INSERT INTO @t 
     SELECT '<Fields> <Field Name="Serial">99</Field> <Field Name="ID">xx</Field> <Field Name="childIndex">99</Field> </Fields>' 
SELECT x 
FROM @t 

SELECT Serial = x.value('data(for $f in //Field 
       where $f/@Name="Serial" 
       return $f)[1]', 'int') 
     , ID = x.value('data(for $f in //Field 
       where $f/@Name="ID" 
       return $f)[1]', 'varchar(2)') 
     , childIndex = x.value('data(for $f in //Field 
       where $f/@Name="childIndex" 
       return $f)[1]', 'int') 
FROM @t    
0

你可以嘗試這樣的事情:

SELECT 
    UpdFld.value('(@Name)', 'varchar(20)') 
FROM 
    STG_Participant_16_Month_AUDIT 
CROSS APPLY 
    COLUMNS_UPDATED.nodes('/Fields/Field') AS Tbl(UpdFld) 

它吸引所有<Field>節點列表在根<Fields>節點內,並從這些XML元素中提取Name屬性。

我得到的輸出是這樣的:

enter image description here