powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / динамические курсоры из переменной sql и каскадное обновление
9 сообщений из 9, страница 1 из 1
динамические курсоры из переменной sql и каскадное обновление
    #39991121
ВячеславЛ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Решаю задачу по каскадному обновлению дерева рецептов.

Кратко:

Рецепт может содержать набор сырья или любой другой рецепт, например полуфабрикаты.

Рецепт1: сырье1, сырье2, сырье3

Рецепт2: рецепт1, сырье4, сырье5

Рецепт3: рецепт1, рецепт2, сырье1

Задача заключается в внесении себестоимости для одного из сырья, с последующим пересчетом себестоимости всех рецептов.

Т.е. в нашем случае, если изменить себестоимость сырья 1, то необходимо пересчитать Рецепт1, затем Рецепт2 и Рецепт 3


Написал процедуру:
Код: sql
1.
--расчет и обновление себестоимости рецепта в первом уровне  дерева по коду сырья



Далее пытаюсь динамически сформировать курсор, который ищет второй уровень по дереву и запускает эту же процедуру


Код: 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.
27.
declare @sql nvarchar(max)
set @sql = '
   DECLARE @seb'+convert(nvarchar(20),@sire)+' float '+ ' 
   DECLARE @kod'+convert(nvarchar(20),@sire)+' int  '+ ' 

   DECLARE my_cur'+convert(nvarchar(20),@sire)+' CURSOR FOR  '+ ' 
	select себестоиомсть, код  '+ ' 
	from сырье where код in (select сырье from #sebe'+convert(nvarchar(20),@sire)+') and наименование like ''%ПФ%''  '+ ' 
   
   OPEN my_cur'+convert(nvarchar(20),@sire)+' 

   FETCH NEXT FROM my_cur'+convert(nvarchar(20),@sire)+' INTO @seb'+convert(nvarchar(20),@sire)+', @kod'+convert(nvarchar(20),@sire)+' 

   WHILE @@FETCH_STATUS = 0  '+ ' 
   BEGIN  '+ ' 
  
        exec dbo.update_sebe @kod'+convert(nvarchar(20),@sire)+', @seb'+convert(nvarchar(20),@sire)+' 

        FETCH NEXT FROM my_cur'+convert(nvarchar(20),@sire)+' INTO @seb'+convert(nvarchar(20),@sire)+', @kod'+convert(nvarchar(20),@sire)+' 
   END  '+ ' 
   

   CLOSE my_cur'+convert(nvarchar(20),@sire)+' 
   DEALLOCATE my_cur'+convert(nvarchar(20),@sire)+' 
   GO'
   print @sql
   exec(@sql)



при выполнении вываливается ошибка
Ниже результат вывода print @sql

Код: 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.
   DECLARE @seb26 float  
   DECLARE @kod26 int   

   DECLARE my_cur26 CURSOR FOR   
	select себестоиомсть, код   
	from сырье where код in (select сырье from #sebe26) and наименование like '%ПФ%'   
   
   OPEN my_cur26 

   FETCH NEXT FROM my_cur26 INTO @seb26, @kod26 

   WHILE @@FETCH_STATUS = 0   
   BEGIN   
  
        exec dbo.update_sebe @kod26, @seb26 

        FETCH NEXT FROM my_cur26 INTO @seb26, @kod26 
   END   
   

   CLOSE my_cur26 
   DEALLOCATE my_cur26 
   GO
Сообщение 102, уровень 15, состояние 1, строка 23
Неправильный синтаксис около конструкции "my_cur26".




Почему я решил сделать динамический курсор?

При каскадном запуске процедуры, появляется ошибка, о том что курсор уже создан.

Почему появляется ошибка не могу понять...

Может нельзя делать динамические курсоры из текстовой переменной?

Может есть более простое решение?
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991123
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
go не является командой TSQL, и вы ее никогда не выполните через exec

З.Ы. Но решение -- ужаснее не придумаешь.
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991128
ВячеславЛ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич
go не является командой TSQL, и вы ее никогда не выполните через exec

З.Ы. Но решение -- ужаснее не придумаешь.


Какие варианты посоветуете?
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991129
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВячеславЛ
Гавриленко Сергей Алексеевич
go не является командой TSQL, и вы ее никогда не выполните через exec

З.Ы. Но решение -- ужаснее не придумаешь.


Какие варианты посоветуете?
Для начала уберите go, может заработает и так.
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991138
ВячеславЛ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич
ВячеславЛ
пропущено...


Какие варианты посоветуете?
Для начала уберите go, может заработает и так.


Спасибо, вроде пошло.
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991169
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВячеславЛ, курсоры локальными объявите.
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991268
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВячеславЛ,

А не проще сделать сырье с ценами в отдельную таблицу, рецепты тоже и 3 таблицу их связь. Приложил пример

Смотря на ваши данные
Рецепт1: сырье1, сырье2, сырье3

Рецепт2: рецепт1, сырье4, сырье5

Рецепт3: рецепт1, рецепт2, сырье1

я так понял Рецепт2 состоит из того сырья, что и Рецепт1 + сырье4, сырье5, а Рецепт3 из Рецепт1 и Рецепт2, но почему сырье1 повторяется?

мне кажется, что бы избавиться от таких сложных действий с курсоров, проще изменить архитектуру хранения данных.
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991347
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha
но почему сырье1 повторяется?


Например, яйца могут использоваться для приготовления теста, а итоговое изделие - хачапури с яичницей. Сырьё одно, использование разное.

А если это рецепты из фармацевтики или химической отрасли, то один и тот же реактив может применяться в разных целях.
...
Рейтинг: 0 / 0
динамические курсоры из переменной sql и каскадное обновление
    #39991402
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Focha
но почему сырье1 повторяется?


Например, яйца могут использоваться для приготовления теста, а итоговое изделие - хачапури с яичницей. Сырьё одно, использование разное.

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

да, что не подумал
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / динамические курсоры из переменной sql и каскадное обновление
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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