【问题标题】:The sub request has returned several values子请求返回了几个值
【发布时间】:2020-07-06 20:16:47
【问题描述】:

这是我的代码:

CREATE TABLE IF NOT EXISTS Artfacture 
(
     N int(6) unsigned NOT NULL,
     Code varchar(50) NOT NULL,
     Ht Numeric NOT NULL 
)

INSERT INTO Artfacture (N, Code, Ht) 
VALUES ('1', '1', '10'), ('1', '2', '20'),('1', '3', '30');

CREATE TABLE IF NOT EXISTS Facture 
(
     N int(6) unsigned NOT NULL,
     Ht Numeric NOT NULL 
)

INSERT INTO Facture (N, Ht) 
VALUES ('1', '60');

CREATE TABLE IF NOT EXISTS Article 
(
     Code varchar(50) NOT NULL, 
     Famille varchar(50) NOT NULL 
)

INSERT INTO Article (Code, Famille) 
VALUES ('1', 'F1'), ('2', 'F2'), ('3', 'F3');

CREATE TABLE IF NOT EXISTS Farticle 
(
     Designation varchar(50) NOT NULL, 
     Compte varchar(50) NOT NULL 
)

INSERT INTO Farticle (Designation, Compte)  
VALUES ('F1', '700000'), ('F2', '710000'), ('F3', '720000');

CREATE TABLE IF NOT EXISTS Ecritures 
(
     Date Date,
     Pièce varchar(50) NOt NULL,
     Compte varchar(50) NOT NULL, 
     Aux varchar(50),
     Libelle varchar(100) NOT NULL,
     Débit numeric NOT NULL
     Crédit numeric NOT NULL  
)

我的请求是一个触发器,其中在表Facture 中添加、更新或删除一些新行,它必须在Ecritures 中添加、更新、删除行数与Artfacture 相同的行

CREATE TRIGGER [dbo].[tr_Facture] 
ON [dbo].[Facture]
FOR INSERT, UPDATE, DELETE 
AS
     DECLARE @dat AS date,
             @piece AS nvarchar(10),
             @piece1 AS nvarchar(10),
             @de money, @cr money, 
             @code AS nvarchar(255),
             @compte AS nvarchar(50),
             @Aux AS nvarchar(50),
             @lib AS nvarchar(50),
             @Famille AS nvarchar(255)

     SET @de = 0
     SET @Aux = ''
     SET @piece = (SELECT [N] FROM inserted)
     SET @piece1= (SELECT [N] FROM deleted)
     SET @dat = (SELECT [Date] FROM [dbo].[Facture] WHERE [N] = @piece)
     SET @lib = 'FACTURE DE VENTE - ' + (SELECT [Societe] FROM [dbo].[Facture] WHERE [N] = @piece)
     SET @Compte = (SELECT F.CompteV FROM Artfacture AF 
                    INNER JOIN Article A ON A.Code = AF.Code 
                    INNER JOIN Farticle F ON F.Designation = A.Famille 
                    WHERE N = @piece)
     set @Cr = (select AF.Ht from Artfacture AF inner join Article A on A.Code = AF.Code where N = @piece)
     begin
     IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted )
     insert into F_Ecritures (Date,Piece,Compte,Auxiliere,Libelle,Débit,Crédit)
     select @dat,@piece,F.CompteV,@Aux,@lib,@de, AF.Ht
     from Artfacture AF
     inner join F_Article A on A.Code = AF.Code
     inner join F_Farticle F on F.Designation = A.Famille
     where N = @piece
     group by F.CompteV, AF.Ht;
     ELSE IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
     update Ecritures set                            Date=@dat,Piece=@piece,Compte=@compte,Auxiliere=@Aux,Libelle=@lib,Débit=@de,Crédit=@cr where Piece=@piece          and Compte=@Compte
     ELSE IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)

         DELETE FROM [dbo].[Ecritures] WHERE Piece = @piece1
     end

问题是我收到子请求返回多个值的错误.....

谁能帮帮我?

【问题讨论】:

  • 第一个代码肯定不是 T-SQL,而第二个是 T-SQL。那么你真正使用的 rdbms 是什么?
  • 触发器是高度特定于供应商的 - 所以请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或完全不同的东西。
  • 是sqlserver,对不起
  • 触发器针对整个更新集运行,而不是针对每一行。所以这条线将失败SET @piece = (SELECT [N] FROM inserted),因为插入的很可能包含超过 1 行。
  • 请问如何解决?

标签: sql-server triggers


【解决方案1】:

由于触发器作用于整个集合,因此您需要像这样构造它。逻辑可能与您尝试做的不太匹配,但您应该能够使用此模式获得想法。

update Ecritures set <column expressions>
from inserted
join ECritures on eCritures.Piece=inserted.N

insert ECritures(<column list>)
select <columnist>
from inserted 
where not exists(select * from deleted where deleted.Piece=inserted.N)

delete eCritures 
from eCritures
join deleted on eCritures.Piece=deleted.N
where not exists(select * from inserted where inserted.N=deleted.N)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2021-11-01
    相关资源
    最近更新 更多