【发布时间】:2008-12-04 22:11:36
【问题描述】:
我在 SQL 2005 数据库中有一个表,其中包含定义为 xml 数据类型的列。我正在尝试编写查询 xml 并从 select 语句返回结果集的存储过程。我已经看到了返回标量值或 xml 的示例,但没有看到如何返回结果集。
我将不得不使用 openxml 还是有其他解决方案?
【问题讨论】:
标签: xml sql-server-2005 types
我在 SQL 2005 数据库中有一个表,其中包含定义为 xml 数据类型的列。我正在尝试编写查询 xml 并从 select 语句返回结果集的存储过程。我已经看到了返回标量值或 xml 的示例,但没有看到如何返回结果集。
我将不得不使用 openxml 还是有其他解决方案?
【问题讨论】:
标签: xml sql-server-2005 types
xml 数据类型有自己的一组方法,您可以使用这些方法来处理列中的数据。在这种情况下,你可能会使用这样的东西:
select xmlColumnName.value('XpathExpression', 'outputSqlType') from dataTable
例如,
select xmlColumnName.value('/root/node[@name="myname"]', 'varchar(60)')
方法有query()、value()、exist()、modify()和nodes(),你可以在Books Online了解更多。
【讨论】:
您可以使用 xml 数据类型或 OPENXML。另一个发帖人给出了xml数据类型的例子,所以这里是一个OPENXML例子。
这确实取决于 XML 模式。 SQL Server 可能不太喜欢您的架构。如果您对架构有任何控制权,那么它会有所帮助。您最终可能不得不使用表变量并通过多次调用 OPENXML 来构建数据来查询所有内容。
例如,可以如下处理 XML 输入:
DECLARE @idoc int
DECLARE @doc nvarchar(max)
SET @doc = '
<xml>
<Entry Type="Error" Start="2008-11-19 02:16:00" End="2008-11-20 04:55:00" />
<Entry Type="Success" Start="2008-11-25 12:45:00" End="2008-11-25 13:01:00" />
</xml>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @xml
SELECT [EventType]
,[EventStart]
,[EventEnd]
FROM OPENXML (@idoc, '//Event',1)
WITH ([Type] varchar(30)
,[Start] varchar(30)
,[End] varchar(30)
)
我面临的一个挑战是解析 XML 日期(带有“T”和可能时区的 ISO8601)。我最终用一行代码创建了一个 .NET 程序集,将其转换为 SQL 喜欢的日期时间。
【讨论】: