powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимая процедура с курсором
10 сообщений из 10, страница 1 из 1
Хранимая процедура с курсором
    #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
Хранимая процедура с курсором
    #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
Хранимая процедура с курсором
    #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
Хранимая процедура с курсором
    #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
Хранимая процедура с курсором
    #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
Хранимая процедура с курсором
    #39783878
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
Хранимая процедура с курсором
    #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
Хранимая процедура с курсором
    #39784204
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_ДОБАВЛЯЙТЕ тогда данные в таблицу/табличную переменную,- и в конце делайте select.Он же так и делает.

Использование курсора, конечно, тут выглядит комично, но, может, это такое задание от препода...
...
Рейтинг: 0 / 0
Хранимая процедура с курсором
    #39784258
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, непонятно, зачем объявлять переменную типа CURSOR.
...
Рейтинг: 0 / 0
Хранимая процедура с курсором
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хранимая процедура с курсором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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