Я работаю над SQL Server 2008. Мне нужно создать json из двух таблиц, которые имеют отношение один ко многим. Таблицы Customer
и Orders
.
У каждого клиента может быть один или несколько заказов. Json создается путем получения данных из таблицы клиентов, а затем добавления всех покупок, которые они совершили.
Ниже мой запрос. Я также приложил вывод json из запроса. Это работает и создает действительные jsons. Проблема в том, что это слишком медленно, так как я использую курсор для циклического перемещения по таблице Customer
. Мне удалось избежать курсора, чтобы получить данные из таблицы Orders
, используя для пути XML. Поскольку мне приходится обрабатывать миллионы строк, я должен заменить курсор каким-либо другим механизмом.
DECLARE @PaymentType VARCHAR(50),
@Email VARCHAR(100),
@OrderId INT
DECLARE CustomerCursor CURSOR FAST_FORWARD FOR
SELECT TOP 10
PaymentType, Email, OrderId
FROM
CUSTOMER
OPEN CustomerCursor
FETCH NEXT FROM CustomerCursor INTO @PaymentType, @Email, @OrderId
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @customer VARCHAR(MAX)
DECLARE @order VARCHAR(MAX)
DECLARE @customer_with_order VARCHAR(MAX)
-- construct order json
SET @order = '[' + STUFF((SELECT ',{"orderProductID":' + CAST(orderProductID AS VARCHAR) +
',"productType":"' + ProductType + '"' +
',"productName":"' + ProductName + '"' +
',"categoryName":"' + CategoryName + '"' + '}'
FROM ORDERS
WHERE orderid = @OrderId
FOR XML PAT(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') + ']'
-- construct customer json
SET @customer = '{"email":"' + CASE WHEN @Email IS NULL THEN '' ELSE
@Email END + '"'
+ ',"eventName": "ChristmasSale", "dataFields": {'
+ '"orderId":' + CAST(CASE WHEN @OrderId IS NULL THEN 0 ELSE
@OrderId END AS VARCHAR)
+ ',"paymentType":"' + CASE WHEN @PaymentType IS NULL THEN
'' ELSE @PaymentType END + '"'
+ ',"products": '
-- combine these two
SET @customer_with_order = @customer + @order + '}}'
-- insert into CUSTOMER_ORDER_DATA
INSERT INTO CUSTOMER_ORDER_DATA(email, order_id, orders)
VALUES (@Email, @OrderId, @customer_with_order)
FETCH NEXT FROM CustomerCursor INTO @PaymentType, @Email, @OrderId
END
CLOSE CustomerCursor
DEALLOCATE CustomerCursor
