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);