我正在运行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
答案 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
属性。
我得到这样的输出: