使用XTbl在SQL Server中解析非标准XML

时间:2013-11-20 17:45:36

标签: sql sql-server xml

我在列中有一个序列化的数据,我希望从以下形式检索单个值:

<FirstNode>Something</><SecondNode>Something Else</>

我想从SQL Server中检索“Something”。我尝试了以下内容:

declare @data xml;
set @data = cast([my data source] as xml);

select @data.value('(/UserName)[1]','varchar(50)')

我可能不喜欢这个,我在解析XML方面没有太多的经验。任何帮助都会很棒。

编辑:我收到错误

  

XML解析:第1行,第20个字符,非法限定名称字符

1 个答案:

答案 0 :(得分:1)

只需使用CHARINDEX和SUBSTRING函数即可获取所需的数据。将我的例子变成一个函数可能是你最好的选择。

DECLARE @tbl TABLE(data VARCHAR(MAX))
INSERT INTO @tbl VALUES
    ('<FirstNode>Something</><SecondNode>Something Else</>'),
    ('<SecondNode>Something Else</><FirstNode>More Something</>'),
    ('<BadNoe>Something</><SecondNode>Something Else</>')

DECLARE @fnd VARCHAR(64)
DECLARE @end VARCHAR(64)
SET @fnd = '<FirstNode>'
SET @end = '</>'

SELECT SUBSTRING(a.[data], a.[start] + LEN(@fnd), a.[end] - (a.[start] + LEN(@fnd)))
FROM (SELECT data [data], CHARINDEX(@fnd, data, 0) [start], CHARINDEX(@end, data, CHARINDEX(@fnd, data, 0)) [end] FROM @tbl) a
WHERE a.[start] > 0