Получение ошибки при использовании UNION all с запросом, который имеет присвоение переменной - PullRequest
0 голосов
/ 21 октября 2019
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

получение следующей ошибки

Оператор SELECT, который присваивает значение переменной, не должен сочетаться с операциями извлечения данных.

Назначение переменной не допускаетсяв операторе, содержащем оператор UNION, INTERSECT или EXCEPT верхнего уровня.

1 Ответ

1 голос
/ 21 октября 2019

Это слишком долго для комментария.

Во-первых, SQL Server не позволяет одному SELECT возвращать набор результатов и назначать значения переменных. Это встроено в язык.

Во-вторых, присвоение переменной в значительной степени предполагает, что базовый запрос вернет одну строку (или, возможно, до одной строки).

A UNION ALLзапрос - предположительно - собирается вернуть несколько строк. Вы можете подумать: «Ну, на самом деле действительно возвращает только одну строку, так что все в порядке». Однако я могу понять, почему разработчики языка просто запретили синтаксис.

Что вы можете сделать?

  1. Вы можете поместить UNION ALL в подзапрос и выполнить командуназначение во внешнем запросе.
  2. Вы можете выполнить назначение по первому запросу. Если ничего не возвращается, попробуйте второй запрос.
  3. Возможно, вы сможете перефразировать логику, чтобы этот конкретный запрос не требовался.

Если (3) представляет интерес, ярекомендую вам задать новый вопрос, объяснить логику и предоставить примеры данных и желаемых результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...