Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:存储过程和发送dbmail_Sql Server_Stored Procedures - Fatal编程技术网

Sql server SQL Server:存储过程和发送dbmail

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]

创建存储过程的原因是安排一个作业,使用SQL Server db mail向我们的员工(协调员)发送两周一次的报告

我在用正确的方式工作方面遇到了问题。我通常不使用游标,但找不到其他选择。 问题就在这里。我通过设置条件来测试查询,只向一个协调员发送一条记录“if@Coord_Email=”lamez。sw1@gmail.com,其中n.id='43422546'。然而,查询已经运行了5分钟,所以我不得不取消它

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='',那么他们只是创建了一个无止境的循环。