1

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

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

第一记录:

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

第二记录:

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

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

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

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

4

4 回答 4

1

这有帮助吗?

INSERT INTO @t (data) SELECT '
<客户>
  <名称>xyz</名称>
  <ssn>432-54-4231</ssn>
</客户>'

INSERT INTO @t (data) SELECT '
<emp>
  <name>abc</name>
  <sal>5000</sal>
</emp>'
声明 @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
*/

于 2010-04-28T07:55:39.633 回答
0

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

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

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

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

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

于 2009-06-15T09:08:55.297 回答
0

一个选项是创建一系列显示 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
于 2009-06-15T11:43:01.090 回答
0

使用 open xml 方法

DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldoc

SELECT * into #test
FROM OPENXML (@idoc, 'xmlfilepath',2)
WITH (Name varchar(50),ssn varchar(20)
)

执行 sp_xml_removedocument @idoc

在#test 中获取数据后,您可以对其进行操作。

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

于 2009-06-30T05:49:18.057 回答