我正在将大量记录从我们的SQL Server数据库提取为XML,然后发送给客户端。但是,由于行数(大约6,000)和字段数(每个产品大约200),我可以成功获取数据,但是由于它的大小,如果我尝试将其写入屏幕或发送给它,则由于其大小(超出了响应缓冲区)。
我想做的是将数据分成较小的部分,我可以想出一种方法,通过遍历响应和每500个左右的产品来拆分响应。
但是我想知道是否有一种方法可以在SQL中完成?我的想法是,我可以使用游标或通过创建一个临时id表,然后对其进行联接来生成一批XML,但是对我来说,这似乎效率很低。
我正在使用的简化SQL:
SELECT (
SELECT product_id, sku, title
FROM products
FOR XML PATH('value'), ROOT('products'), ELEMENTS XSINIL
) as my_xml
我希望返回的记录集看起来像这样-
+--------+----------------------------+
| Batch | XML |
+--------+----------------------------+
| 1 | <products xmlns xsi= ... > |
| 2 | <products xmlns xsi= ... > |
| 3 | <products xmlns xsi= ... > |
| ... | ... |
+--------+----------------------------+
答案 0 :(得分:1)
下面的SQL是我将其分成500个批次的方式-
SELECT batch,
CAST((
SELECT
product_id, title, sku
FROM products AS p
WHERE p.product_id BETWEEN min_id AND max_id
FOR XML PATH('value'), ROOT('products'), ELEMENTS XSINIL
) AS varchar(max)) as product_xml
FROM (
SELECT
MIN(product_id) as min_id,
MAX(product_id) as max_id,
batch
FROM (
SELECT
ROW_NUMBER() OVER(ORDER BY product_id ASC)/500 AS batch,
product_id
FROM products
) t
GROUP BY batch
) t1
ORDER BY batch
它运行非常快,并返回我要查找的行