在我们的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
关于数据表如何连接的想法:
答案 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站点解决的简单问题。