我们需要在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和其他几个但没有运气的尝试。
答案 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