Sql 我们必须这样做。但是,我仍然建议您检查估计的执行计划,并在实际循环和使用游标之间进行比较。我会说,您是否尝试过它的性能如何?跑步需要多长时间?但是是的,看起来也不错。只要确保您有order和order_item的索引,为什么不让您的order_item内部
Sql 我们必须这样做。但是,我仍然建议您检查估计的执行计划,并在实际循环和使用游标之间进行比较。我会说,您是否尝试过它的性能如何?跑步需要多长时间?但是是的,看起来也不错。只要确保您有order和order_item的索引,为什么不让您的order_item内部,sql,performance,tsql,sql-server-2012,database-performance,Sql,Performance,Tsql,Sql Server 2012,Database Performance,我们必须这样做。但是,我仍然建议您检查估计的执行计划,并在实际循环和使用游标之间进行比较。我会说,您是否尝试过它的性能如何?跑步需要多长时间?但是是的,看起来也不错。只要确保您有order和order_item的索引,为什么不让您的order_item内部联接order查询一次临时表或表变量,并在游标和sp_send_dbmail函数中使用它,而不是多次点击数据库times@JamieD77你完全正确! DECLARE @email NVARCHAR(254); DECLARE email_c
我们必须这样做。但是,我仍然建议您检查估计的执行计划,并在实际循环和使用游标之间进行比较。我会说,您是否尝试过它的性能如何?跑步需要多长时间?但是是的,看起来也不错。只要确保您有order和order_item的索引,为什么不让您的
order_item内部联接order
查询一次临时表或表变量,并在游标和sp_send_dbmail函数中使用它,而不是多次点击数据库times@JamieD77你完全正确!
DECLARE @email NVARCHAR(254);
DECLARE email_cursor CURSOR READ_ONLY FOR
SELECT DISTINCT o.email
FROM order_item AS i
INNER JOIN order AS o ON i.order_id = o.order_id
WHERE i.send_email = '1';
OPEN email_cursor;
FETCH NEXT FROM email_cursor INTO @email;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_send_dbmail
@profile_name = 'mail'
@recipients = @email,
@subject = 'Order Items',
@body =
N'<table>' +
N'<tr>' +
N'<th>Order</th>' +
N'<th>Item</th>' +
N'</tr>' +
CAST ((
SELECT
i.order_id,
i.name
FROM order_item AS i
INNER JOIN order AS o ON i.order_id = o.order_id
WHERE i.send_email = '1'
AND o.email = @email
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'</table>',
@body_format = 'HTML';
END;
DECLARE @temp TABLE(
email NVARCHAR(254),
order_id INT,
name NVARCHAR(MAX)
)
INSERT INTO @temp
SELECT
o.email
i.order_id,
i.name
FROM order_item AS i
INNER JOIN order AS o ON i.order_id = o.order_id
WHERE i.send_email = '1'.
DECLARE @email NVARCHAR(254);
DECLARE email_cursor CURSOR READ_ONLY FOR
SELECT DISTINCT email
FROM @temp
OPEN email_cursor;
FETCH NEXT FROM email_cursor INTO @email;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_send_dbmail
@profile_name = 'mail'
@recipients = @email,
@subject = 'Order Items',
@body =
N'<table>' +
N'<tr>' +
N'<th>Order</th>' +
N'<th>Item</th>' +
N'</tr>' +
CAST ((
SELECT
order_id,
name
FROM @temp
WHERE email = @email
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'</table>',
@body_format = 'HTML';
END;
DECLARE @temp TABLE(
email NVARCHAR(254),
order NVARCHAR (MAX)
)
INSERT INTO @temp (email, order)
SELECT
o.email,
c.order
FROM order AS o
CROSS APPLY (
SELECT CAST ((
SELECT
oi.order_id AS td,
oi.name AS td
FROM order_item oi
WHERE oi.order_id = o.order_id
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) )
) c (order)
WHERE i.send_email = 1
DECLARE @email NVARCHAR(254),
DECLARE email_cursor CURSOR LOCAL FAST_FORWARD
FOR
SELECT email, order
FROM @temp
OPEN email_cursor;
FETCH NEXT FROM email_cursor INTO @email, @order
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
EXEC sp_send_dbmail
@profile_name = 'mail'
@recipients = @email,
@subject = 'Order Items',
@body =
N'<table>' +
N'<tr>' +
N'<th>Order</th>' +
N'<th>Item</th>' +
N'</tr>' +
@order +
N'</table>',
@body_format = 'HTML';
FETCH NEXT FROM email_cursor INTO @email, @order
END;
CLOSE email_cursor
DEALLOCATE email_cursor