如何在SQL中跨行组合二进制块?

时间:2016-03-02 10:43:05

标签: sql sql-server tsql blob sql-server-2014

我们需要在SQL Server 2014数据库中连接二进制数据块。我们对此的要求是由于WAN链路上varbinary(max)数据的复制速度缓慢,如下所述 - Slow merge replication over a WAN link - only downloads因此我们必须将varbinary(max)列减小到更小的宽度。

给出一个表和一些虚拟数据:

DECLARE @testTable TABLE
(
    [ItemIdx] int,
    [ChunkIdx] int,
    [BinaryData] varbinary(8000)
)
INSERT INTO @testTable ([ItemIdx], [ChunkIdx], [BinaryData]) VALUES (1, 1, 0x00112233), (1, 3, 0x44556677), (1, 2, 0x8899AABB)
INSERT INTO @testTable ([ItemIdx], [ChunkIdx], [BinaryData]) VALUES (2, 1, 0xFFEEDDCC), (2, 3, 0xBBAA9988), (2, 2, 0x77665544)

我可以编写T-SQL来连接对应于单个ItemIdx的行的数据:

DECLARE @concatData varbinary(max)
SELECT @concatData = COALESCE(@concatData, 0x) + BinaryData FROM @testTable
WHERE ItemIdx = 1
ORDER BY ChunkIdx

导致0x001122338899AABB44556677,即单个ItemIdx的预期结果。

有没有办法以一种简洁的方式连接所有ItemIdx条目? 我想要的结果如下:

ItemIdx | Data
1       | 0x001122338899AABB44556677
2       | 0xFFEEDDCC77665544BBAA9988
CLR将是一个非常明智的选择,虽然缺乏对表值参数的支持使我认为任何方法都很尴尬。我曾经尝试过使用GROUP BY,COALESCE,FOR XML,CTE和其他几个但没有运气的尝试。

1 个答案:

答案 0 :(得分:3)

您可以使用$("a").on('click', function(e) { e.preventDefault(); window.location.hash = $(this).data("target-id"); });

加入它
FOR XML

LiveDemo

对于所有行,您可以使用:

DECLARE @ItemIdx INT = 1;

SELECT CONVERT(VARBINARY(MAX),
    (
     SELECT CONVERT(VARCHAR(MAX), BinaryData,2) AS [text()]
     FROM @testTable
     WHERE ItemIdx = @ItemIdx
     ORDER BY ChunkIdx
     FOR XML Path('')
    ),2)

LiveDemo2

最后检查SELECT DISTINCT ItemIdx, CONVERT(VARBINARY(MAX), ( SELECT CONVERT(VARCHAR(MAX), BinaryData,2) AS [text()] FROM @testTable t2 WHERE t1.ItemIdx = t2.ItemIdx ORDER BY ChunkIdx FOR XML Path('') ),2) AS Data FROM @testTable t1; 表格:

LiveDemo3

输出:

varchar