将FOR XML拆分为批处理

时间:2019-06-14 15:16:52

标签: sql sql-server for-xml-path

我正在将大量记录从我们的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= ... > |
| ...    | ...                        |
+--------+----------------------------+

1 个答案:

答案 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

它运行非常快,并返回我要查找的行