Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимая процедура с курсором / 10 сообщений из 10, страница 1 из 1
07.03.2019, 21:15
    #39783769
Андрей1985
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Написал хранимую процедуру с использование курсора.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE PROCEDURE [dbo].[Search_goods] @GoodsId AS INT, @number_in as int, @DocId as int output
AS
declare @cur cursor; 
set @cur=cursor for select p.DocId
from Party p
inner join Prihod h on (p.DocId=h.PrihodId) and p.VidDoc=1
left outer join rashod r on (p.DocId=r.RashodId) and p.VidDoc=2 and r.GoodsId=h.GoodsID 
inner join Warehouse w on (p.WarehouseId=w.WarehouseId)
where (h.Number -
CASE WHEN r.Number IS NULL THEN 0 ELSE r.Number END)>0
and p.GoodsId=@GoodsId
order by h.DatePrihod, h.TimePrihod

OPEN @cur
FETCH NEXT FROM @cur into @DocId
WHILE @@FETCH_STATUS = 0
BEGIN
	FETCH NEXT FROM @cur into @DocId 
   
END
close @cur;
deallocate @cur;



Результат должен быть
11
12
13

Код: sql
1.
2.
3.
4.
5.
6.
declare @DocId int
exec Search_goods 
        @GoodsId = 5,
	@number_in = 12,
	@DocId=@DocId  OUTPUT
SELECT 	@DocId



Получаю на выходе только последнюю запись, значение 13. Что не так делаю? Помогите разобраться.
...
Рейтинг: 0 / 0
07.03.2019, 22:02
    #39783777
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Андрей1985Результат должен быть
11
12
13

Код: sql
1.
2.
3.
4.
5.
6.
declare @DocId int
exec Search_goods 
        @GoodsId = 5,
	@number_in = 12,
	@DocId=@DocId  OUTPUT
SELECT 	@DocId


Получаю на выходе только последнюю запись, значение 13. Что не так делаю? Помогите разобраться.Переменная @DocId - это целое число. Одно целое число. Наверняка есть такие языки программирования, в который в переменную можно записать несколько чисел, но T-SQL не из таких.
...
Рейтинг: 0 / 0
07.03.2019, 22:04
    #39783779
londinium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Андрей1985,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE PROCEDURE [dbo].[Search_goods] @GoodsId AS INT, @number_in as int, @DocId as int output
AS
declare @OutTable TABLE(DocID INT);
DECLARE @InTemp INT;
declare @cur cursor; 
set @cur=cursor for select p.DocId
from Party p
inner join Prihod h on (p.DocId=h.PrihodId) and p.VidDoc=1
left outer join rashod r on (p.DocId=r.RashodId) and p.VidDoc=2 and r.GoodsId=h.GoodsID 
inner join Warehouse w on (p.WarehouseId=w.WarehouseId)
where (h.Number -
CASE WHEN r.Number IS NULL THEN 0 ELSE r.Number END)>0
and p.GoodsId=@GoodsId
order by h.DatePrihod, h.TimePrihod

OPEN @cur
FETCH NEXT FROM @cur into @DocId
WHILE @@FETCH_STATUS = 0
BEGIN
	FETCH NEXT FROM @cur into @InTemp;
        INSERT @OutTable(DocID)VALUES(@InTemp);
   
END
close @cur;
deallocate @cur;
SELECT DocID FROM @OutTable;
...
Рейтинг: 0 / 0
07.03.2019, 22:42
    #39783787
Андрей1985
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Cпасибо. Переделал через таблицу. Работает...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER PROCEDURE [dbo].[Search_goods] @GoodsId AS INT, @number_in as int, @DocId as int output
AS
declare @OutTable TABLE(DocID INT);
declare @cur cursor; 
set @cur=cursor for select p.DocId
from Party p
inner join Prihod h on (p.DocId=h.PrihodId) and p.VidDoc=1
left outer join rashod r on (p.DocId=r.RashodId) and p.VidDoc=2 and r.GoodsId=h.GoodsID 
inner join Warehouse w on (p.WarehouseId=w.WarehouseId)
where (h.Number -
CASE WHEN r.Number IS NULL THEN 0 ELSE r.Number END)>0
and p.GoodsId=@GoodsId
order by h.DatePrihod, h.TimePrihod

OPEN @cur
FETCH NEXT FROM @cur into @DocId
WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT @OutTable(DocID)VALUES(@DocId);
	FETCH NEXT FROM @cur into @DocId;  
END
close @cur;
deallocate @cur;
SELECT DocID FROM @OutTable;



Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE	@DocId int

EXEC	Search_goods
		@GoodsId = 5,
		@number_in = 12,
		@DocId = @DocId OUTPUT
GO
...
Рейтинг: 0 / 0
07.03.2019, 22:54
    #39783791
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Андрей1985,
Напишите вот так и не парьте себе мозг.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE PROCEDURE [dbo].[Search_goods] @GoodsId AS INT, @number_in as int
AS
select p.DocId
from Party p
inner join Prihod h on (p.DocId=h.PrihodId) and p.VidDoc=1
left outer join rashod r on (p.DocId=r.RashodId) and p.VidDoc=2 and r.GoodsId=h.GoodsID 
inner join Warehouse w on (p.WarehouseId=w.WarehouseId)
where (h.Number -
CASE WHEN r.Number IS NULL THEN 0 ELSE r.Number END)>0
and p.GoodsId=@GoodsId
order by h.DatePrihod, h.TimePrihod


Если же вам нужно потом результат использовать в другом запросе - напишите функцию вместо процедуры.
...
Рейтинг: 0 / 0
08.03.2019, 15:56
    #39783878
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Андрей1985
Код: sql
1.
2.
(h.Number -
CASE WHEN r.Number IS NULL THEN 0 ELSE r.Number END)>0

Это что за динозавр? Может, так?
Код: sql
1.
h.Number>ISNULL(r.Number,0)

?
Или
Код: sql
1.
(r.Number IS NULL AND h.Number>0 OR h.Number>r.Number)

?
...
Рейтинг: 0 / 0
09.03.2019, 23:46
    #39784190
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Андрей1985Cпасибо. Переделал через таблицу. Работает...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER PROCEDURE [dbo].[Search_goods] @GoodsId AS INT, @number_in as int, @DocId as int output
AS
declare @OutTable TABLE(DocID INT);
declare @cur cursor; 
set @cur=cursor for select p.DocId
from Party p
inner join Prihod h on (p.DocId=h.PrihodId) and p.VidDoc=1
left outer join rashod r on (p.DocId=r.RashodId) and p.VidDoc=2 and r.GoodsId=h.GoodsID 
inner join Warehouse w on (p.WarehouseId=w.WarehouseId)
where (h.Number -
CASE WHEN r.Number IS NULL THEN 0 ELSE r.Number END)>0
and p.GoodsId=@GoodsId
order by h.DatePrihod, h.TimePrihod

OPEN @cur
FETCH NEXT FROM @cur into @DocId
WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT @OutTable(DocID)VALUES(@DocId);
	FETCH NEXT FROM @cur into @DocId;  
END
close @cur;
deallocate @cur;
SELECT DocID FROM @OutTable;



Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE	@DocId int

EXEC	Search_goods
		@GoodsId = 5,
		@number_in = 12,
		@DocId = @DocId OUTPUT
GO


Что, реально работает?!

PS Используйте вариант Mind - у Вас по факту простой select с параметрами. Если логика НА САМОМ ДЕЛЕ более сложная, то да - делайте через курсор, но ДОБАВЛЯЙТЕ тогда данные в таблицу/табличную переменную,- и в конце делайте select. Вызов получившейся Вашей процедуры из TSQL:
Код: sql
1.
 insert into MyTable (field1, field2,...) execute MyProc param1='dff', param2='dsfsf';
...
Рейтинг: 0 / 0
10.03.2019, 01:26
    #39784204
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
SIMPLicity_ДОБАВЛЯЙТЕ тогда данные в таблицу/табличную переменную,- и в конце делайте select.Он же так и делает.

Использование курсора, конечно, тут выглядит комично, но, может, это такое задание от препода...
...
Рейтинг: 0 / 0
10.03.2019, 13:30
    #39784258
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
Кстати, непонятно, зачем объявлять переменную типа CURSOR.
...
Рейтинг: 0 / 0
10.03.2019, 14:44
    #39784266
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура с курсором
iapКстати, непонятно, зачем объявлять переменную типа CURSOR.
ну например, "A cursor variable does not have to be explicitly deallocated. The variable is implicitly deallocated when it goes out of scope.", взято отсюда .
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимая процедура с курсором / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]