1

我正在运行 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
4

2 回答 2

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              
于 2012-10-29T02:46:00.423 回答
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属性。

我得到这样的输出:

在此处输入图像描述

于 2012-10-29T06:08:14.630 回答