存储的过程错误:消息512,级别16,状态1,过程sp_ActFTC,行64子查询返回的值大于1

时间:2018-12-26 18:05:18

标签: sql-server

执行存储过程后,出现以下错误:

  

消息512,级别16,状态1,过程sp_ActFTC,第64行
  子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

我在数据库中有两个表FTC_AltFichaTecnicaComp,我需要在给定日期更新FichaTecnicaComp表。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_ActFTC] 
AS
    DECLARE @Codigo NVARCHAR(20),
            @DataAlteracao  DATE,
            @Categoria NVARCHAR(20),
            @catord INT,
            @SubCategoria NVARCHAR(255),
            @subcatord INT,
            @Ordem INT,
            @CodigoComp NVARCHAR(10),
            @DesignacaoComp NVARCHAR(50),
            @QuantidadeComp NVARCHAR(25),
            @UnidadeComp NVARCHAR(5),
            @intRowCount INT,
            @upAction NVARCHAR(255);

    SELECT @Codigo = ft_alt.codigo   
    FROM ft_alt;

    SELECT @DataAlteracao = ft_alt.dataalteracao  
    FROM ft_alt;

    SELECT Categoria = ftc_alt.categoria
    FROM ftc_alt;

    SELECT catord = ftc_alt.catord
    FROM ftc_alt;

    SELECT SubCategoria = ftc_alt.subcategoria
    FROM ftc_alt;

    SELECT subcatord = ftc_alt.subcatord
    FROM ftc_alt;

    SELECT Ordem = ftc_alt.ordem
    FROM ftc_alt;

    SELECT CodigoComp = ftc_alt.codigocomp
    FROM ftc_alt;

    SELECT DesignacaoComp = ftc_alt.designacaocomp
    FROM ftc_alt;

    SELECT QuantidadeComp = ftc_alt.quantidadecomp
    FROM ftc_alt;

    SELECT UnidadeComp = ftc_alt.unidadecomp
    FROM ftc_alt;

    SELECT @intRowCount = @@RowCount;

    SET @upAction = 'Composição nutricional actualizada/alterada'
BEGIN
    IF (@DataAlteracao = (SELECT CONVERT(DATE, GETDATE())))
    BEGIN
        SET NOCOUNT ON 

        UPDATE [dbo].[FichaTecnicaComp]
        SET [Codigo] = @Codigo,
            [DataAlteracao] = @DataAlteracao,
            categoria = ftc_alt.categoria,
            catord = ftc_alt.catord,
            subcategoria = ftc_alt.subcategoria,
            subcatord = ftc_alt.subcatord,
            ordem = ftc_alt.ordem,
            codigocomp = ftc_alt.codigocomp,
            designacaocomp = ftc_alt.designacaocomp,
            quantidadecomp = ftc_alt.quantidadecomp,
            unidadecomp = ftc_alt.unidadecomp
        FROM [dbo].[FichaTecnicaComp] 
        JOIN ftc_alt ON [dbo].[FichaTecnicaComp].[Codigo] = (SELECT ft_alt.codigo
                                                             FROM ft_alt)
                     AND [dbo].[FichaTecnicaComp].Ordem = (SELECT FTC_Alt.Ordem
                                                           FROM FTC_Alt)
    END
END  

预期结果是FichaTecnicaComp中的数据已从FTC_Alt更新。 不会发生。

应注意,FichaTecnicaComp具有以下工作触发器:插入,更新和删除。

如果您需要这些触发器的代码,只需询问。

2 个答案:

答案 0 :(得分:1)

在此上下文中使用的

子查询只能返回一个值,而您的子查询仅返回export function prepadSigned(hexStr) { ... } Ordem列的所有值。直接在codigo子句中使用列,而不要作为子选择。您还将需要使用别名而不是完整的表名。仅使用关键字JOIN将默认为INNER JOIN,这是我假设您打算使用的内容,但是明确声明这将有助于提高可读性。您帖子中的第一个子查询使用ON而不是ft_alt,但是由于这是对此表的唯一引用,所以我猜这是一个错字?

ftc_alt

答案 1 :(得分:0)

该错误消息本身表明,此存储过程中使用的子查询之一返回多个记录,而您的update语句只能以其编写方式处理返回的一行。如果在查询下面一个接一个地运行,您将知道问题出在哪里。您需要修复子查询,或者可能需要在主查询中使用IN代替=。希望对您有所帮助。

BEGIN
        SET NOCOUNT ON 
        UPDATE FTC
        SET 
            FTC.[Codigo] = FT.Codigo,
            FTC.[DataAlteracao] = FT.dataalteracao,
            FTC.categoria = ALT.categoria,
            FTC.catord = ALT.catord,
            FTC.subcategoria = ALT.subcategoria,
            FTC.subcatord = ALT.subcatord,
            FTC.ordem = ALT.ordem,
            FTC.codigocomp = ALT.codigocomp,
            FTC.designacaocomp = ALT.designacaocomp,
            FTC.quantidadecomp = ALT.quantidadecomp,
            FTC.unidadecomp = ALT.unidadecomp
        FROM [dbo].[FichaTecnicaComp] FTC
        INNER JOIN ft_alt FT ON FTC.Codig = FT.Codigo
        INNER JOIN ftc_alt ALT ON FTC.Ordem = ALT.Ordem     
    END

并且还可以独立运行在下面。

     (SELECT ft_alt.codigo
     FROM   ft_alt)
     AND
     [dbo].[FichaTecnicaComp].Ordem =
     (SELECT FTC_Alt.Ordem
     FROM FTC_Alt