Sql server SQL Server:存储过程和发送dbmail
创建存储过程的原因是安排一个作业,使用SQL Server db mail向我们的员工(协调员)发送两周一次的报告 我在用正确的方式工作方面遇到了问题。我通常不使用游标,但找不到其他选择。 问题就在这里。我通过设置条件来测试查询,只向一个协调员发送一条记录“if@Coord_Email=”lamez。sw1@gmail.com,其中n.id='43422546'。然而,查询已经运行了5分钟,所以我不得不取消它Sql server SQL Server:存储过程和发送dbmail,sql-server,stored-procedures,Sql Server,Stored Procedures,创建存储过程的原因是安排一个作业,使用SQL Server db mail向我们的员工(协调员)发送两周一次的报告 我在用正确的方式工作方面遇到了问题。我通常不使用游标,但找不到其他选择。 问题就在这里。我通过设置条件来测试查询,只向一个协调员发送一条记录“if@Coord_Email=”lamez。sw1@gmail.com,其中n.id='43422546'。然而,查询已经运行了5分钟,所以我不得不取消它 ALTER PROCEDURE [dbo].[sp_MZ_Coord_rpt_s9]
ALTER PROCEDURE [dbo].[sp_MZ_Coord_rpt_s9]
AS
BEGIN
DECLARE @Member_ID VARCHAR(20)
DECLARE Report_S9 CURSOR FOR
SELECT id
FROM name
WHERE status = 'a'
OPEN Report_S9
FETCH NEXT FROM Report_S9 INTO @member_ID
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Coord_ID Varchar(20)
DECLARE @CO_ID Varchar(20)
DECLARE @Coord_Name Varchar(50)
DECLARE @Coord_Email Varchar(50)
SELECT @CO_ID = ID
FROM Relationship
WHERE id = @Member_ID
SELECT @Coord_ID = target_id
FROM Relationship
WHERE RELATION_TYPE = 'CO'
SELECT @Coord_Name = FULL_NAME
FROM Name
WHERE ID = @Coord_ID
SELECT @Coord_Email = email
FROM Name
WHERE id = @Coord_ID
IF @Coord_Email <> ''
BEGIN
SELECT
n.id, n.CO_ID, n.FULL_NAME, a.TRANSACTION_DATE, a.UF_1, r.TARGET_ID
FROM name n
INNER JOIN activity a ON n.id = a.id
INNER JOIN Tops_Profile tp ON a.id = tp.ID
INNER JOIN Relationship r ON n.CO_ID = r.ID
WHERE
n.id = @member
AND UF_1 <> ''
AND (DATEDIFF(dd, TRANSACTION_DATE, GETDATE()) < 2)
AND r.RELATION_TYPE = 'co'
ORDER BY
TRANSACTION_DATE
EXEC msdb..sp_send_dbmail
@profile_name = 'TOPS.ADMIN',
@recipients = @Coord_Email,
--@blind_copy_recipients = ,
@subject = 'S9 Report'
End
FETCH NEXT FROM Report_S9 INTO @member_ID
END
CLOSE Report_S9
DEALLOCAT Report_S9
End
ALTER PROCEDURE[dbo]。[sp_MZ_Coord_rpt_s9]
作为
开始
声明@Member_ID VARCHAR(20)
声明报表\u S9光标用于
选择id
从名字
其中status='a'
打开报告9
从报告_S9获取下一个到@member_ID
而@@FETCH\u STATUS=0
开始
声明@Coord_ID Varchar(20)
声明@CO_ID Varchar(20)
声明@Coord_Name Varchar(50)
声明@Coord_电子邮件Varchar(50)
选择@CO_ID=ID
来自关系
其中id=@Member\u id
选择@Coord\u ID=target\u ID
来自关系
其中关系类型='CO'
选择@Coord\u Name=全名
从名字
其中ID=@Coord\u ID
选择@Coord_Email=Email
从名字
其中id=@Coord\u id
如果@Coord_电子邮件“”
开始
挑选
n、 id,n.CO\u id,n.FULL\u NAME,a.TRANSACTION\u DATE,a.UF\u 1,r.TARGET\u id
从名字n
n.id=a.id上的内部联接活动a
a.id=tp.id上的内部连接顶部\u剖面tp
n.CO_ID=r.ID上的内部联接关系r
哪里
n、 id=@member
和UF_1“
和(DATEDIFF(dd,TRANSACTION_DATE,GETDATE())<2)
和r.relationship_TYPE='co'
订购人
交易日
EXEC msdb..sp_send_dbmail
@profile_name='TOPS.ADMIN',
@收件人=@Coord_电子邮件,
--@盲拷贝收件人=,
@主题='S9报告'
终点
从报告_S9获取下一个到@member_ID
结束
关闭报告9
DEALLOCAT报告9
终点
非常感谢您的帮助。下一步取数不在空值检查范围内。即使无事可做,您也需要继续循环。为什么要将其包装到事务中?您没有回滚事务的代码,即使执行了回滚,也没有什么可回滚的。你也应该考虑改变你的前缀习惯(或者更好的是根本没有前缀)。以前是不同的剧本。我已经修好了。你还有什么建议吗?问题就在这里。你说“我在让它以正确的方式工作方面遇到了问题。”。这是什么意思?“正确的方式”到底是做还是不做。我们可以帮助您解决问题,但您必须向我们解释问题所在。我测试了脚本,设置了一个标准,仅向我发送“if@Coord_Email=”lamez。sw1@gmail.com'并仅检索一条记录,其中n.id='4342546'。查询已经运行了5分钟多,所以我不得不取消它。我想问的是,这个查询中是否有可以解决的错误。可能有错误,但我们无法判断。我们看不到您的屏幕,也不知道您的桌子是什么样子。我们不是人类的sql编译器……事实上,sql编译器可以访问我们没有的数据和表结构。有太多的原因,这可能是运行缓慢,很难知道从哪里开始。捕捉好。如果OP有一行email='',那么他们只是创建了一个无止境的循环。