【问题标题】:SQL Server: Output an XML field as tabular data using a stored procedureSQL Server:使用存储过程将 XML 字段输出为表格数据
【发布时间】:2009-06-15 08:03:59
【问题描述】:

我正在使用一个带有 XML 数据字段的表来存储数据库中所有其他表的审计跟踪。

这意味着同一个 XML 字段具有各种 XML 信息。例如,我的表有两条 XML 数据记录,如下所示:

1st 记录:

<client>
  <name>xyz</name>
  <ssn>432-54-4231</ssn>
</client>

2nd 条记录:

<emp>
  <name>abc</name>
  <sal>5000</sal>
</emp>

这是两种示例格式,只有两条记录。该表实际上在同一个字段中有更多的 XML 格式,并且每种格式中有许多记录。

现在我的问题是,在查询时我需要将这些 XML 格式转换为表格结果集。

我有哪些选择?查询此表并从中生成报告将是一项常规任务。我想创建一个可以传递给我的存储过程,我需要查询“&lt;emp&gt;”或“&lt;client&gt;”,然后我的存储过程应该返回表格数据。

【问题讨论】:

  • 您是在问如何将一组已知模式的 XML 分解成表,或者如何确定模式并即时生成适当的表?另外,SQL 2K 还是 SQL 2K5/2K8 ?

标签: sql-server xml stored-procedures sqlxml


【解决方案1】:

这有帮助吗?

INSERT INTO @t (data) SELECT ' xyz名称> 432-54-4231客户>' INSERT INTO @t (data) SELECT ' abc5000' 声明 @el VARCHAR(20) 选择 @el = '客户' 选择 x.value('local-name(.)', 'VARCHAR(20)') AS ColumnName, x.value('.','VARCHAR(20)') 作为列值 从T CROSS APPLY data.nodes('/*[local-name(.)=sql:variable("@el")]') a (x) /* 列名 列值 -------------------- -------- 客户 xyz432-54-4231 */ 选择 @el = 'emp' 选择 x.value('local-name(.)', 'VARCHAR(20)') AS ColumnName, x.value('.','VARCHAR(20)') 作为列值 从T CROSS APPLY data.nodes('/*[local-name(.)=sql:variable("@el")]') a (x) /* 列名 列值 -------------------- -------- 雇员 abc5000 */

【讨论】:

    【解决方案2】:

    xyz432-54-4231 和 abc5000 都不是有效的 XML。

    您可以尝试使用 like 语句仅选择一种特定格式,f.e.:

    select * 
    from YourTable 
    where YourColumn like '[a-z][a-z][a-z][0-9][0-9][0-9][0-9]'
    

    这将匹配 3 个字母后跟 4 个数字。

    更好的选择可能是在表中添加一个额外的列,在其中保存日志记录的类型。然后您可以使用该列选择所有“emp”或“client”行。

    【讨论】:

    • 问题在此期间已被编辑,您看到的是未格式化的版本。
    【解决方案3】:

    一种选择是创建一系列视图来显示 aduit 表,每种类型的关系都在您正在执行的关系中 例如

    select
        c.value('name','nvarchar(50)') as name,
        c.value('ssn', 'nvarchar(20)') as ssn
    from yourtable
    cross apply yourxmlcolumn.nodes('/client') as t(c)
    

    然后你可以对 emp 遵循相同的模式

    您还可以创建一个视图(或计算列)来识别每个 xml 类型,如下所示:

    select yourxmlcolumn.value('local-name(/*[1])', 'varchar(100)') as objectType
    from yourtable
    

    【讨论】:

      【解决方案4】:

      使用open xml方法

      声明@idoc int
      执行 sp_xml_preparedocument @idoc 输出,@xmldoc

      选择 * 进入#test
      FROM OPENXML (@idoc, 'xmlfilepath',2)
      WITH (名称 varchar(50),ssn varchar(20)
      )

      EXEC sp_xml_removedocument @idoc

      在#test 中获取数据后 你可以操纵它。

      您可以将 diff 数据放在 diff xml 文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 2020-11-18
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        相关资源
        最近更新 更多