存储过程不会触发上一个命令

时间:2012-06-21 21:34:12

标签: sql-server tsql

在我们的SQL Server(版本10.0.1600)上,我有一个我写的存储过程。

它没有抛出任何错误,并且在数据库中插入后返回正确值

但是,最后一个命令spSendEventNotificationEmail(发送电子邮件通知)未运行。

我可以使用相同的数据手动运行spSendEventNotificationEmail脚本,并显示通知,因此我知道它有效。

我在存储过程中如何调用它有什么问题吗?

[dbo].[spUpdateRequest](@packetID int, @statusID int output, @empID int, @mtf nVarChar(50)) AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @id int
    SET @id=-1
    -- Insert statements for procedure here
    SELECT A.ID, PacketID, StatusID
    INTO #act FROM Action A JOIN Request R ON (R.ID=A.RequestID)
    WHERE (PacketID=@packetID) AND (StatusID=@statusID)

    IF ((SELECT COUNT(ID) FROM #act)=0) BEGIN -- this statusID has not been entered. Continue

        SELECT ID, MTF
        INTO #req FROM Request
        WHERE PacketID=@packetID

        WHILE (0 < (SELECT COUNT(ID) FROM #req)) BEGIN
            SELECT TOP 1 @id=ID FROM #req
            INSERT INTO Action (RequestID, StatusID, EmpID, DateStamp)
            VALUES (@id, @statusID, @empID, GETDATE())
            IF ((@mtf IS NOT NULL) AND (0 < LEN(RTRIM(@mtf)))) BEGIN
                UPDATE Request SET MTF=@mtf WHERE ID=@id
            END
            DELETE #req WHERE ID=@id
        END
        DROP TABLE #req

        SELECT @id=@@IDENTITY, @statusID=StatusID FROM Action

        SELECT TOP 1 @statusID=ID FROM Status
        WHERE (@statusID<ID) AND (-1 < Sequence)

        EXEC spSendEventNotificationEmail @packetID, @statusID, 'http:\\cpweb:8100\NextStep.aspx'

    END ELSE BEGIN

        SET @statusID = -1

    END

    DROP TABLE #act

END

关于数据表如何连接的想法:

my database

1 个答案:

答案 0 :(得分:2)

从您的评论中我得到的主要是C#开发。一个基本的测试是确保使用你期望的完全相同的参数调用sproc

PRINT '@packetID: ' + @packetID
PRINT '@statusID: ' + @statusID
EXEC spSendEventNotificationEmail @packetID, @statusID, 'http:\\cpweb:8100\NextStep.aspx'

这样你就知道到达了exec语句2.确切的值

如果这一切都有效,那么我非常好的候选人是你有权运行sproc和你调用它的(C#?)代码没有。我希望错误很难。

快速测试以确定EXEC是否正常执行是在其后的虚拟表中插入。

更新1

我建议添加PRINT语句,但实际上正如你所说,你不能(轻松地)从C#中捕获它们。您可以做的是将2个变量插入到您新创建的日志表中。这样您就可以知道C#执行的确切值。

如果你添加权限,它现在有效的原因我不能给你一个现成的答案。 SQL安全性对我来说也不透明。但是进一步研究自己是好事。您是否必须同时添加来宾? 它还有助于了解spSendEventNotificationEmail中的内容。 sproc使用之前没有获得许可的资源很有可能。这可能是一个像桌子或可能是另一个sproc的对象。安全性在很大程度上取决于上下文/设置,而不是像SO这样的Q / A站点解决的简单问题。