如何在select语句中将XML blob与逗号分隔的字段值合并?

时间:2015-09-25 16:10:11

标签: sql sql-server xml

我需要合并两个数据。一个字段是一个包含URL的XML blob。第二个字段包含这些URL的标签。我需要在Web表单中显示它,但不能显示一个巨大的URL。

第1场

<string>www.google.com</string>
<string>www.yahoo.com</string>

Field 2

Google,Yahoo

我需要的结果是能够在字段2中生成带有标签的html链接。

所以我想要的结果是一个看起来像这样的字符串

<a href="http://www.google.com">Google</a><br><a href="http://www.yahoo.com">Yahoo</a>

依此类推......

我的例子是这样的:

select  replace(cast(cast(replace(AnswerValue,  'xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"','') as xml).query('
                                for $string in //ArrayOfstring/string
                                return <a href="{data($string)}" target="_blank">TEST</a>       ') as nvarchar(max)), '</a>', '</a><br>') as AttachedDocuments

我怎样才能做到这一点?有可能吗?

1 个答案:

答案 0 :(得分:0)

你在想这样的事吗?

编辑:重新阅读你的问题并认为我错了......也许是这样的?

DECLARE @tbl TABLE(urls VARCHAR(MAX), names VARCHAR(MAX));
INSERT INTO @tbl VALUES
 ('<string>www.google.com</string><string>www.yahoo.com</string>','Google,Yahoo')
,('<string>www.test1.com</string><string>www.test2.com</string>','Test1,Test2');

SELECT  '<a href="http://' + vals.XmlUrls.value('*[1]','varchar(max)') + '">' + vals.XmlNames.value('*[1]','varchar(max)') + '</a>' 
       +'<br>'
       +'<a href="http://' + vals.XmlUrls.value('*[2]','varchar(max)') + '">' + vals.XmlNames.value('*[2]','varchar(max)') + '</a>'
FROM @tbl AS tbl
CROSS APPLY(SELECT CAST(urls AS XML) AS XmlUrls
                  ,CAST('<x>' + REPLACE(names,',','</x><x>') + '</x>' AS XML) AS XmlNames
            ) AS vals

只需将其粘贴到空的查询窗口并执行即可。适应您的需求......

编辑前的方法:

DECLARE @urls XML=
'<root>
<url>
<string>www.google.com</string>
<string>www.yahoo.com</string>
</url>
<url>
<string>www.test1.com</string>
<string>www.test2.com</string>
</url>
</root>';

SELECT '<a href="http://' + value1 + '">' +  name1 + '</a><br><a href="http://' + value2 + '">' + name2 + '</a>'
FROM @urls.nodes('/root/url') AS urls(url)
CROSS APPLY(SELECT urls.url.value('string[1]','varchar(max)') AS value1
                  ,urls.url.value('string[2]','varchar(max)') AS value2) AS resolved
CROSS APPLY
(
    SELECT CAST('<x>' + REPLACE(value1,'.','</x><x>') + '</x>' AS XML).value('x[2]','varchar(max)') AS name1
          ,CAST('<x>' + REPLACE(value2,'.','</x><x>') + '</x>' AS XML).value('x[2]','varchar(max)') AS name2
) AS names;