【发布时间】:2010-02-01 20:27:41
【问题描述】:
我们有能力从中间层执行存储过程。基本上,在名为“SQLJobStep”的数据库表中,我们有一个名为“StoredProcedure”的 varchar(300) 列,其中包含如下内容:
usp_SendReminderEmails @Debug=0, @LoginID
通过中间层,用户点击一个链接来运行他们选择的过程。在后端发生的是一个 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”),它可以完美运行。
你有什么建议吗?我确定我遗漏了一些非常基本的东西。
谢谢。
【问题讨论】:
-
您是否尝试过使用 sql profiler 来查看单击链接后究竟执行了什么 sql?
-
尝试添加一个PRINT @StoredProcedure(或将其写入数据库日志表等),看看有什么...
-
您是否在相同的用户上下文中执行代码?您是否使用与中间层使用的凭据相同的凭据在 SQL mgmt studio 中进行连接?
标签: c# sql-server-2005 stored-procedures