2017-10-12 112 views
1

我目前正在努力寻找解决以下问题的方法。SQL Server 2012在单个XML元素中创建VARBINARY列表

我有一个结果集VARBINARY值 - 例如:

  • QAAAAAAAAAE =
  • QAAAAAAAAAQ =

这些结果需要被包装到由单个空格分隔的一个XML元素(以表示一组值)。结果应该如何看实例:

<results>QAAAAAAAAAE= QAAAAAAAAAQ=</results> 

我有同时使用XML PATH的是,我不能合并一个“”(VARCHAR),结果VARBINARY领域的问题。如果我在结果之前添加“',然后转换为varbinary,由于已经转换了空间,所以结果不正确。以下是我迄今为止所尝试的一个示例:

(
    STUFF((SELECT DISTINCT ' ' + CONVERT(VARBINARY, id) 
    FROM results 
    FOR XML PATH('ns2:children') 
    ),1,1,'') 
), 

回答

0

请注意,尝试短SQL命令可能帮助ü实现上述结果:

SELECT REPLACE(T.Data, '</results><results>', ' ') 
FROM 
(
    SELECT STUFF(
       (
        SELECT DATA [results] 
        FROM <table_name> FOR XML PATH('') 
       ), 1, 1, '<') [Data] 
) T; 

结果:

<results>QAAAAAAAAAE= QAAAAAAAAAQ=</results> 
+0

没有,如果有的话,你可能不应该在串级... – Shnugo

0

如果我理解你想要什么?获得<results>QAAAAAAAAAE= QAAAAAAAAAQ=</results>作为结果的方法是:

select ltrim((
    select ' '+cast(id as varchar(50)) 
    from t 
    group by id 
    for xml path(''))) results 
for xml path(''); 

SQL Fiddle Demo

+0

处理XML不,如果有可能你不应该在字符串级别处理XML ...... – Shnugo

1

你不应该在字符串级别的XML处理。这可能有各种副作用...

你可以试试这个:

我填写了一些值的表在VARBINARY列:

DECLARE @table TABLE(SomeData VARBINARY(MAX)); 
INSERT INTO @table VALUES(0x12AF) 
         ,(CAST('test' AS VARBINARY(MAX))) 
         ,(CAST(GETDATE() AS VARBINARY(MAX))); 
SELECT * 
FROM @table; 

结果

SomeData 
0x12AF 
0x74657374 
0x0000A81100AD9F69 

如果你把它当作XML,转换为base64就会隐式完成

SELECT * FROM @table FOR XML PATH('result') 

结果

<result> 
    <SomeData>Eq8=</SomeData> 
</result> 
<result> 
    <SomeData>dGVzdA==</SomeData> 
</result> 
<result> 
    <SomeData>AACoEQCtn2k=</SomeData> 
</result> 

现在有XQuery-function data()拯救你。它会自动串联,以空格隔开的所有子值:

SELECT(
     SELECT * 
     FROM @table 
     FOR XML PATH('result'),TYPE 
     ).query('data(/result/SomeData)') AS result 
FOR XML PATH('results') 

结果是

<results> 
    <result>Eq8= dGVzdA== AACoEQCtn2k=</result> 
</results>