在SQL Server中查询XML列

时间:2012-10-29 01:41:31

标签: sql-server xml sql-server-2008-r2 xquery

我正在运行SQL Server 2008 R2,并且有一个表我可以审核更新语句。

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

2 个答案:

答案 0 :(得分: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              

答案 1 :(得分: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