Разбиение FOR XML на банки - PullRequest
0 голосов
/ 14 июня 2019

Я извлекаю большое количество записей из нашей базы данных SQL Server в XML, чтобы затем отправить их клиенту.Однако из-за количества строк (около 6000) и количества полей (около 200 на продукт) я могу успешно получить данные, но из-за их размера, если я пытаюсь записать их на экран или отправить их, возникает ошибка из-заего размер (превышен буфер ответов).

Я хотел бы разбить данные на более мелкие сегменты, и я могу придумать способ сделать это, просматривая ответ, и каждые 500 или около того продуктов разбивают его.,

Но я хотел знать, будет ли способ сделать это в SQL?Я думаю, что я мог бы использовать курсор или создать временную таблицу идентификаторов, а затем присоединиться к ней, чтобы создать пакеты 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 Ответ

1 голос
/ 14 июня 2019

Следующий 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

Он работает очень быстро и возвращает строки, которые я искал

...