当我尝试从中间层执行存储过程,从另一个存储过程 - 没有任何反应

时间:2010-02-01 20:27:41

标签: c# sql-server-2005 stored-procedures

我们能够从中间层执行存储过程。基本上,在一个名为“SQLJobStep”的数据库表中,我们有一个名为“StoredProcedure”的varchar(300)列,它包含这样的内容:

usp_SendReminderEmails @Debug=0, @LoginID

通过中间层,用户单击链接以运行他们选择的proc。在后端发生的事情是proc(“usp_SQLJobsActionGet”)从“SQLJobStep.StoredProcedure”列中查找正确的值并执行上面的值。

这是执行上述值的“usp_SQLJobsActionGet”代码的一部分:

DECLARE @StepId int
DECLARE @LoginID varchar(12)
DECLARE @StoredProcedure varchar(300)

SET @StepId = 74
SET @LoginID = 'Yoav'

SELECT @StoredProcedure = SJS.StoredProcedure 
FROM SQLJobStep AS SJS
WHERE SJS.StepId = @StepId

SET @StoredProcedure = ISNULL(@StoredProcedure, '')

IF CHARINDEX('@LoginID', @StoredProcedure) > 0
BEGIN
    SET @LoginID = ISNULL(@LoginID, 'UNKNOWN')
    SET @StoredProcedure = REPLACE(@StoredProcedure, '@LoginID', '@LoginID = ''' + @LoginID + '''')
END

IF @StoredProcedure != ''
BEGIN
    EXEC(@StoredProcedure)
END    

相当简单的东西......

上面的代码将原始值转换为(然后执行):

usp_SendReminderEmails @Debug=0, @LoginID = 'Yoav'

问题在于:

执行“usp_SendReminderEmails @ Debug = 0,@ LOGINID ='Yoav'”时,没有任何反应。没有错误返回到中间层。但我知道从SQLJobStep表中提取了一个值,因为我们有其他存储过程值被拉出并且运行正常。 (注意,其他值只有@LoginID参数,而且@ Debug = 0也是如此。)

同时,如果我在SQL Management Studio中运行上面的代码(内部代码和直接调用“usp_SQLJobsActionGet”),它可以很好地工作。

你有什么建议吗?我确信我遗漏了一些非常基本的东西。

感谢。

2 个答案:

答案 0 :(得分:1)

我的建议?使用sp_ExecuteSQL而不是连接/替换:

IF @StoredProcedure != ''
BEGIN
    EXEC sp_ExecuteSQL @StoredProcedure, N'@LoginID varchar(12)', @LoginID
END

总的来说,EXEC应该有效;您确定 @StoredProcedure是否为空?

答案 1 :(得分:0)

感谢您的帮助。我找到了我的问题的答案,你可以猜测它与我原来描述的问题有关:

在usp_SendReminderEmails proc中,我们调用另一个proc来审核发送的每个电子邮件记录。此审计过程将记录插入审计表,然后返回标识(SELECT TOP 1 SCOPE_IDENTITY())。虽然它一次只返回1条记录,但它恰好在游标中调用(在usp_SendReminderEmails中),一次发送出每封电子邮件(注意:这是一个SQL作业过程)。

我注意到在Management Studio中执行usp_SendReminderEmails @ Debug = 0,@ LOGINID ='Yoav'时,它工作正常但是返回了警告(!):

查询已超出结果网格中可显示的最大结果集数。网格中仅显示前100个结果集。

因此,从中间层调用proc时,没有任何反应 - 没有返回错误,但也没有处理usp_SendReminderEmails。我通过在usp_SendReminderEmails中的临时表中插入调用proc来修复它,从而确保它不会被返回(因为它只是一个标识值):

INSERT INTO #AuditData (AuditDataId)
EXEC usp_AuditSave