在SQL存储过程中选择插入更新

时间:2020-07-24 10:37:18

标签: sql sql-server

我试图从创建的过程中获取单个值,但显示错误为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

1 个答案:

答案 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)

但是,如果有多个不同的价值,那显然无济于事。

我们在这里不能给您“解决方案”。您需要考虑特定系统中可能存在的数据,以及您要如何处理这些数据。但是希望这个答案可以帮助您理解问题。

相关问题