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>ルート ノード内のすべてのノードのリストを取得し、それらの XML 要素から属性<Fields>を抽出します。Name

次のような出力が得られます。

ここに画像の説明を入力

于 2012-10-29T06:08:14.630 に答える