从xml中选择一部分文本

时间:2014-02-19 00:16:50

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

<Quote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <error>TLP3: The product has no marked price;</error>
</Quote>

我有一个存储在表的列中的xml,我使用以下查询来提取xml元素:

select 
    CONVERT(XML, CONVERT(NVARCHAR(max), Response)).value('(/Quote/error)[1]','nvarchar(max)') as Exception 

表达式的结果是:

 TL43:The product has no marked price.;

我只想选择代码:TL43

然后我想单独选择:The product has no marked price.

我有办法吗?

XML已更新

2 个答案:

答案 0 :(得分:0)

我不确定您是否在询问使用TSQL XML功能的方法,但基本的SQL功能就足够了。

为了清晰起见,我使用CTE,但你可以在没有CTE的情况下将它们混合在一起。

我假设你可以转换最后的';'在源头'。'在你想要的输出中,如果这实际上是一个要求。

DECLARE @Response VARCHAR(MAX) = '<Quote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<error>TLP3: The product has no marked price;</error>
</Quote>'

;WITH cte AS (
  SELECT CONVERT(XML,@Response).value('(/Quote/error)[1]','nvarchar(max)') as Exception
)
SELECT LEFT(Exception,CHARINDEX(':',Exception)-1) Code
      ,SUBSTRING(Exception,CHARINDEX(':',Exception)+1,LEN(Exception)) Exception
  FROM cte

答案 1 :(得分:0)

select substring(CONVERT(XML,CONVERT(NVARCHAR(max),Response )).value('(/Quote/error)[1]','nvarchar(max)'),0,charindex(':', CONVERT(XML,CONVERT(NVARCHAR(max),Response )).value('(/Quote/error)[1]','nvarchar(max)'))) as Excepiton