Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вложенный запрос вернул больше одного значения  [new]
rage_karcher
Member

Откуда:
Сообщений: 5
выполнение данной инструкции было прервано.
Ошибка
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.


Проблема в том, что данный запрос раньше выдавал больше одного значения и прекрасно выполнялся, что сейчас могло пойти не так?
+ Сама хранимая процедура

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[CalcNach_FLS]
@LS numeric(19,0)
AS


DECLARE @House dec(19,0)

select @House=House
from PROD..tabPK 
where LS=@LS 

DELETE PROD..tabNachP where LS=@LS 

if object_id('tempdb..##DomNah') is not null begin drop table ##DomNah end


DECLARE Dom CURSOR FOR select HouseID from adr_tabHouse 
where HouseID = @House and Enable = 1
		
OPEN Dom

FETCH NEXT FROM Dom INTO @House
WHILE @@FETCH_STATUS = 0
BEGIN   
   exec NahDom @House
   insert into tabNachP(Code,House,LS,FLS,Flat,Room,Area,T,Usl,GM,P,Dat0,Dat1,Nah,PGF,INN)
   select NewID(),@House,LS,FLS,Flat,Isnull(Room,''),Area,T,Usl,GM,P,Dat0,Dat1,round(cast(Nah as money),2),PGF,INN
   from ##DomNah
   where LS = @LS
   drop table ##DomNah
   FETCH NEXT FROM Dom INTO @House
END

CLOSE Dom
DEALLOCATE Dom


---/////////////////////////////////////////////////////////////////////////////////
declare @GM int = (select top 1 GM from tabPeriod where (D is NULL) order by GM desc)
select ls,FLS,
(select Sum(SumP) from CalcStop where GM is null and LS = a.LS) as Sum0,
(select Sum(SumP) from CalcStop where GM = @GM and LS = a.LS) as SumN,
Sum(SumP) as Sum1 into #Calc
from CalcStop a
where Isnull(GM,0)<@GM and LS = @LS
group by LS,FLS

select LS,
case when Sum1>0 then case when Sum1>=Abs(SumN) then SumN else -Sum1 end else 0 end as Nah
into #Result
from #Calc

INSERT INTO [dbo].[tabNachP]([code],[House],[LS],[FLS],[Flat],[Room],[Area],[T],[Usl],[GM],[P],[Dat0],[Dat1],[Nah],[PGF],[INN])
select NewID(),[House],[LS],[FLS],[Flat],[Room],[Area],[T],3,[GM],[P],[Dat0],[Dat1],
(select SumP from CalcStop where ls = N.ls and  GM = N.GM),
--(select Nah from #Result where ls = N.ls and  Nah <> 0),
[PGF],[INN]
from [tabNachP] N
where Usl = 1 and ls in (select ls from #Result where Nah <> 0) and gm >= 213 

drop table #Calc,#Result


exec PROD..CalcPeni_FLS @LS 
exec PROD..CreateKvitEPD_FLS @LS
17 апр 19, 12:45    [21864817]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
Вы уже выяснили, какой именно запрос?
17 апр 19, 12:48    [21864824]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
rage_karcher,

скорее это

(select SumP from CalcStop where ls = N.ls and  GM = N.GM)
17 апр 19, 12:50    [21864828]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
msLex
Member

Откуда:
Сообщений: 7726
Проблема тут

(select SumP from CalcStop where ls = N.ls and  GM = N.GM)


В таблице CalcStop есть записи с одинаковыми ls и GM


Найти их довольно просто
select ls, gm, count(*) from CalcStop group by ls, having count(*) > 1



что с ними делать, вопрос уже к вам и логике работы процедуры
17 апр 19, 12:51    [21864830]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Если это не ошибка, то выбирайте первый попавшийся SELECT TOP (1), если ошибка, то создайте ограничение уникальности в CalcStop .
17 апр 19, 14:21    [21865019]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Владислав Колосов
Если это не ошибка, то выбирайте первый попавшийся SELECT TOP (1), если ошибка, то создайте ограничение уникальности в CalcStop .


выше у него по тем же условиям в подзапросе выбирается sum()
17 апр 19, 14:22    [21865022]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
rage_karcher
Member

Откуда:
Сообщений: 5
msLex
Проблема тут

(select SumP from CalcStop where ls = N.ls and  GM = N.GM)


В таблице CalcStop есть записи с одинаковыми ls и GM


Найти их довольно просто
select ls, gm, count(*) from CalcStop group by ls, gm having count(*) > 1



что с ними делать, вопрос уже к вам и логике работы процедуры


Запрос ничего не выдал.

P.s.: Мне следовало сразу упомянуть, что программа работает из нескольких компонентов баз данных (FKRMO, IMG, PROD, WEBDB). При замене FKRMO на версию более раннего периода, то операция нормально выполняется, но насколько я понял в ней хранятся только ЕПД, сформированные этой операцией
17 апр 19, 14:34    [21865047]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
msLex
Member

Откуда:
Сообщений: 7726
rage_karcher
Запрос ничего не выдал.


Если проблема именно в приведенном вами коде, то ошибка может быть только по указанной мною причине. Сейчас дублей в таблице CalcStop нет, значит они появляются где-то перед выполнение указанного кода.





rage_karcher
P.s.: Мне следовало сразу упомянуть, что программа работает из нескольких компонентов баз данных (FKRMO, IMG, PROD, WEBDB). При замене FKRMO на версию более раннего периода, то операция нормально выполняется, но насколько я понял в ней хранятся только ЕПД, сформированные этой операцией

сомневаюсь, что эта информация как то поможет пролить свет на источник проблем
17 апр 19, 14:40    [21865059]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30712
rage_karcher
Проблема в том, что данный запрос раньше выдавал больше одного значения и прекрасно выполнялся, что сейчас могло пойти не так?
Нет, сервер всегда выдаёт ошибку, если в таком подзапросе возвращается более одной записи.

Нужно разбираться не с версиями и данными, а править багу. Не надо её оставлять.

Когда программист пишет подзапрос (select SumP from CalcStop where ls = N.ls and GM = N.GM), он должен убедиться, что в данные технически невозможно вставить что то, что позволит вернуть более одного значения.
Это делается либо ограничениями (уникальный констрейн на ls и GM), либо агрегатной функцией.
17 апр 19, 14:53    [21865084]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
rage_karcher
Member

Откуда:
Сообщений: 5
товарищ msLex и все, кто пытался помочь, спасибо. Нашел косяк. В прошлом периоде произошел баг и вывел в таблице вместо 26055 строк, 78162 строки, то есть ровно втрое больше. В каждой паре все строки идентичные, кроме уникального ключа. А как можно удалить задвоения? Нашел на сайте техподдержки майкрософт, что можно копировать в отдельную таблицу, убрать задвоенные данные и вернуть, но не получается правильно составить запрос, чтобы вставить данные обратно
[url=]https://support.microsoft.com/ru-ru/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server[/url]
23 апр 19, 17:59    [21870024]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2374
rage_karcher,

select distinct ... from
23 апр 19, 18:02    [21870031]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос вернул больше одного значения  [new]
rage_karcher
Member

Откуда:
Сообщений: 5
StarikNavy,

Да я уже написал его, просто когда скопировал в отдельную таблицу и удалил задвоения из исходной, начал тупить с запросом insert. Догнал только когда начал выходить из офиса, сейчас поправил, вроде все норм стало
23 апр 19, 18:24    [21870046]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить