1

在我们的 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

数据表如何连接的想法:

我的数据库

4

1 回答 1

2

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

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

这样你 1. 知道 exec 语句已经到达 2. 确切的值

如果这一切都有效,那么我非常好的候选人是您有权运行存储过程和调用它的(C#?)代码没有。我希望会抛出一个错误。

查看 EXEC 是否正常执行的快速测试是在它之后在虚拟表中进行插入。

更新 1

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

至于如果您添加权限,为什么它现在可以工作,我无法给您一个现成的答案。SQL 安全性对我来说也不透明。但最好还是进一步研究一下自己。您必须同时添加访客公众吗?它还有助于查看 spSendEventNotificationEmail 内部发生的情况。sproc 很有可能正在使用以前没有权限的资源。这可能是一个像表格这样的对象,也可能是另一个存储过程。安全性在很大程度上取决于上下文/设置,而不是像 SO 这样的 Q/A 网站解决的简单问题。

于 2012-06-21T21:57:14.467 回答