【问题标题】:Querying XML column in SQL Server在 SQL Server 中查询 XML 列
【发布时间】:2012-10-18 08:58:19
【问题描述】:

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

【问题讨论】:

  • 输出为:

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


【解决方案1】:

如果这是您的输出,那么您的触发器似乎没有正确填充 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              

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    SELECT 
        UpdFld.value('(@Name)', 'varchar(20)')
    FROM 
        STG_Participant_16_Month_AUDIT
    CROSS APPLY
        COLUMNS_UPDATED.nodes('/Fields/Field') AS Tbl(UpdFld)
    

    它获取根&lt;Fields&gt; 节点内所有&lt;Field&gt; 节点的列表,并从这些XML 元素中提取Name 属性。

    我得到类似这样的输出:

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2010-09-08
      • 2021-05-16
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多