Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对具有变量赋值的查询使用UNION all时出错_Sql_Sql Server - Fatal编程技术网

Sql 对具有变量赋值的查询使用UNION all时出错

Sql 对具有变量赋值的查询使用UNION all时出错,sql,sql-server,Sql,Sql Server,获取以下错误 为变量赋值的SELECT语句不得与数据检索操作结合使用 在包含顶级UNION、INTERSECT或EXCEPT运算符的语句中不允许变量赋值 这篇评论太长了 首先,SQL Server不允许一次选择既返回结果集又分配变量值。这是语言中固有的 其次,变量赋值基本上假设基础查询将返回一行,或者最多返回一行 UNIONALL查询可能会返回多行。您可能会想:它实际上只返回一行,所以这没关系。然而,我可以理解为什么语言的设计者会拒绝语法 你能做什么 您可以将UNION ALL放在子查询中,并在

获取以下错误

为变量赋值的SELECT语句不得与数据检索操作结合使用

在包含顶级UNION、INTERSECT或EXCEPT运算符的语句中不允许变量赋值


这篇评论太长了

首先,SQL Server不允许一次选择既返回结果集又分配变量值。这是语言中固有的

其次,变量赋值基本上假设基础查询将返回一行,或者最多返回一行

UNIONALL查询可能会返回多行。您可能会想:它实际上只返回一行,所以这没关系。然而,我可以理解为什么语言的设计者会拒绝语法

你能做什么

您可以将UNION ALL放在子查询中,并在外部查询中进行赋值。 您可以在第一个查询上运行分配。如果没有返回任何内容,请尝试第二个查询。 您可以重新表述逻辑,这样就不需要这个特定的查询了。
如果您对3感兴趣,我建议您提出一个新问题,解释逻辑,并提供示例数据和所需结果。

OK。那你觉得不清楚或不同意的错误怎么办?你正在做它说你做不到的事情,通过尝试将select@latest=作为联合查询的一部分。错误告诉你问题所在。不能在同一查询中为变量赋值并返回数据集。这似乎是一个XY问题。您实际上想在这里做什么。选择@latest必须在此变量中放置一个值。但是,该并集使您具有2个或更多值。这就是为什么它是不可接受的。还有,为什么是不同的,然后是统一的?如果要得到重复的行,那么使用UNION是没有意义的。进入21世纪-停止使用let me try@Gordon Linoff
USE [DDRS]
GO
/****** Object:  StoredProcedure [dbo].[Test]    Script Date: 10/20/2019 8:59:04 PM ******/
--
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[Test]
as


begin
SELECT DISTINCT 
    DO.Contract_Number AS Contract_Number,
    'Ambiguity in contract No' AS Remarks
FROM 
    weight3 w3, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID AND w3.ContractNo <> DO.Contract_Number 

UNION ALL

SELECT DISTINCT 
    w3.ContractNo AS contract_number,
    'Ambiguity in Transporter Name' AS Remarks
FROM 
    weight3 w3, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID AND w3.Transporter_Name <> DO.TransporterName 
--For closed DO 
declare @latest date
declare @ContractNumber nvarchar(200)
select @latest=Max(DO.Time_stamp), @ContractNumber=DO.Contract_Number from Delivery_Order DO where DO_Status='Received' group by DO.Contract_Number
Union ALL
select w3.ContractNo as contract_number,'After closing the DO data is entered!' AS Remarks
from weight3 w3 where 
 @latest<(select distinct MAX(w3.second_time) from weight3 w3 where w3.ContractNo=@ContractNumber) and w3.ContractNo=@ContractNumber
End