执行存储过程后,出现以下错误:
消息512,级别16,状态1,过程sp_ActFTC,第64行
子查询返回的值超过1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
我在数据库中有两个表FTC_Alt
和FichaTecnicaComp
,我需要在给定日期更新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
具有以下工作触发器:插入,更新和删除。
如果您需要这些触发器的代码,只需询问。
答案 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