2012-10-29 63 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