我试图从创建的过程中获取单个值,但显示错误为Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <,
基本上,我想返回@statusReturn
的单个值,但是我却无法做到这一点,任何人都可以告诉我们如何实现这一点。
CREATE PROCEDURE [DBO].[uspGetJobStausAnyalyticaSpdDeltaRefresh]
( @Execution_Job_ID INT)
AS
BEGIN
SELECT TOP 3
ji.jobname,
jel.*
INTO #tempjobstatus
FROM jobexecutionlog jel
INNER JOIN jobinfo ji
ON jel.jobid=ji.jobid
WHERE jel.jobid IN (897,809,876)
AND jel.jobexecutionlogid <= @Execution_Job_ID
ORDER BY 2 DESC
DECLARE @statusSPDRefresh VARCHAR(30),
@statusAnalyticsRefresh VARCHAR(30),
@statusJobExecutionLogId INT ,
@statusReturn INT
SET @statusSPDRefresh =
(
SELECT jobstatus
FROM #tempjobstatus
WHERE jobname ='Refresh')
IF (@statusSPDRefresh = 'Failed')
BEGIN
SET @statusAnalyticsRefresh =
(
SELECT jobstatus
FROM #tempjobstatus
WHERE jobname ='AnaRefresh')
IF (@statusAnalyticsRefresh = 'In Progress')
BEGIN
SET @statusJobExecutionLogId =
(
SELECT jobexecutionlogid
FROM #tempjobstatus
WHERE jobname ='AnaRefresh')
UPDATE jobexecutionlog
SET jobstatus = 'Failed'
WHERE jobexecutionlogid = @statusJobExecutionLogId
SET @statusReturn=1
END
ELSE SET @statusReturn =0
END
ELSE IF (@statusSPDRefresh = 'Completed')
BEGIN
SET @statusAnalyticsRefresh =
(
SELECT jobstatus
FROM #tempjobstatus
WHERE jobname ='AnaRefresh')
IF (@statusAnalyticsRefresh = 'In Progress')
BEGIN
SET @statusJobExecutionLogId =
(
SELECT jobexecutionlogid
FROM #tempjobstatus
WHERE jobname ='AnaRefresh')
UPDATE jobexecutionlog
SET jobstatus = 'Completed'
WHERE jobexecutionlogid = @statusJobExecutionLogId
SET @statusReturn=1
END
ELSE SET @statusReturn =0
END
ELSE
BEGIN
SET @statusReturn=0
END
DROP TABLE #tempjobstatus
END
答案 0 :(得分:0)
您有许多类似的构造:
set @SomeVariable = (select ...)
但是,如果select语句返回多个值,SQL应该怎么做?例如:
create table t(i int)
go
insert t values (1), (2)
go
declare @i int;
set @i = (select i from t);
我的t
表中有两个值:1和2。我们在这里做什么?我们不能将两个值都分配给一个变量。因此,SQL表示“我不知道我应该在这里做什么”。
这就是为什么您会收到错误消息。这意味着您对set @variable = (select ...)
表进行的#tempjobstatus
查询中至少有一个针对您所使用的select语句返回了多行。
您可以“强制”返回一行,例如通过使用top 1
,但这可能只是一个bug。因为如果有一排以上,您要返回top 1
返回哪一行?
如果所有行都相同,则可以使用distinct
:
set @myvariable = (select distinct somevalue from sometable)
但是,如果有多个不同的价值,那显然无济于事。
我们在这里不能给您“解决方案”。您需要考虑特定系统中可能存在的数据,以及您要如何处理这些数据。但是希望这个答案可以帮助您理解问题。