Sql 如何修复此错误“子查询返回的值超过1。当子查询遵循=、!=、

Sql 如何修复此错误“子查询返回的值超过1。当子查询遵循=、!=、,sql,sql-server,Sql,Sql Server,仅针对您的技术错误-您需要更改此设置 CREATE PROCEDURE Task2_Create1397_1396 AS DECLARE @Check INT DECLARE @Sal INT --SET @Check = (SELECT COUNT(Title)FROM Buy) SET @Sal = ( SELECT YEAR(Tarikh) FROM Buy ) IF (@Sal = 1398) INSERT INTO Buy

仅针对您的技术错误-您需要更改此设置

CREATE PROCEDURE Task2_Create1397_1396
AS
DECLARE @Check INT
DECLARE @Sal INT

--SET @Check = (SELECT COUNT(Title)FROM Buy)
SET @Sal = (
        SELECT YEAR(Tarikh)
        FROM Buy
        )

IF (@Sal = 1398)
    INSERT INTO Buy
    SELECT Title
        ,Type1
        ,Tedat
        ,DATEADD(DAY, - 2, DATEADD(YEAR, - 1, Tarikh))
        ,Descrip
    FROM Buy

IF (@Sal = 1397)
    INSERT INTO Buy
    SELECT Title
        ,Type1
        ,Tedat
        ,DATEADD(DAY, - 2, DATEADD(YEAR, - 1, Tarikh))
        ,Descrip
    FROM Buy
进入

您也可以在上面的select语句中使用here order by子句

除此之外,在将返回值赋给变量时,还需要检查它在select中返回多个值的原因

您可以将if语句两次重组为一个,如下所示

SET @Sal = (SELECT Top 1 YEAR(Tarikh) FROM Buy)

子查询的唯一位置是:

IF (@Sal = 1398)
BEGIN
    INSERT INTO Buy
    SELECT Title
        ,Type1
        ,Tedat
        ,DATEADD(DAY, - 2, DATEADD(YEAR, - 1, Tarikh))
        ,Descrip
    FROM Buy -- <add where condition here for if block>
END
ELSE IF (@Sal = 1397)
BEGIN
    INSERT INTO Buy
    SELECT Title
        ,Type1
        ,Tedat
        ,DATEADD(DAY, - 2, DATEADD(YEAR, - 1, Tarikh))
        ,Descrip
    FROM Buy -- <add where condition here for another if block>
END
这段代码——即使您将其限制为一行——毫无意义。这将为Buy中的每一行返回一行。你想要哪一个?您没有指定您想要的年份,因此我怀疑您想要:

SET @Sal = (SELECT YEAR(Tarikh) FROM Buy);
接下来,将名为@SAL的参数设置为year值是非常不寻常的——这在英语中不起作用,尽管它可能在另一种语言中起作用。我只是指出这一点

代码的下一部分过于复杂,编写得很糟糕:

除THEN条件外,两个IF区块均为相同井。 您正在使用不带列列表的INSERT。这在特别代码中几乎是不可接受的。永久性代码中不应允许使用它。 实际上,您可以完全消除IF。 因此,我建议:

SET @Sal = (SELECT MAX(YEAR(Tarikh)) FROM Buy);

您的表似乎没有主键。这也是一个问题,我建议您也修复数据模型。

删除了不相关的标记:这是纯SQL
SET @Sal = (SELECT MAX(YEAR(Tarikh)) FROM Buy);
INSERT INTO Buy (Title, Type1, Tedat, Tarikh, Descrip)
    SELECT Title, Type1, Tedat, DATEADD(DAY, - 2, DATEADD(YEAR, - 1, Tarikh)),
           Descrip
    FROM Buy
    WHERE @Sal IN (1398, 1397);