powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опытным пользователям SQL. BUG или нет?
15 сообщений из 15, страница 1 из 1
Опытным пользователям SQL. BUG или нет?
    #32072398
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начиная с 6.5 много bugов исправил MS SQL, но вот всегда меня мучил один вопрос почему они не обращают внимание
на следующий алгоритм:
Код: plaintext
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
CREATE PROC SourceCalc
AS  --первоначальный расчет который использует 10 клиентов
 
 CREATE TABLE #t1 ( fld1 int )
 insert into #t1(fld1) values( 100 )
 select fld1 from #t1 
GO

CREATE PROC ModifyCalc
AS  --расчет производится на основе расчетных данных в SourceCalc код который модифицировать нельзя(например вынести временную таблицу),
 
    --так как при этом придется переписывать клиентские приложения
 
 CREATE TABLE #t1( fld1 int)

 INSERT INTO #t1 (fld1)
 EXEC SourceCalc
 UPDATE #t1 SET fld1=fld1* 100 
 SELECT fld1 FROM #t1 
GO

CREATE PROC InetCalc
AS  --потребовалось вызвать расчет ModifyCalc который уже используют другие приложения
 
    --и также изменить некоторые данные и вывести их в инет
 
 CREATE TABLE #t1( fld1 int)

 INSERT INTO #t1 (fld1)
 EXEC ModifyCalc

 UPDATE #t1 SET fld1=fld1+ 1 
 SELECT fld1 FROM #t1 
GO

 --Запутанная логика, редко такое увидишь, но все же! Если учитывать что первая процедура пишется полгода назад, 
 
 --затем три месяца спустя ставят похожую задачу с некоторыми изменениями для ввода в эксплуатацию новых клиентов
 
 --без затрагивания существующих очевидно просто решение исп-то то что было при этом гарантировать, что если
 
 --меняется расчет в SourceCalc, то он должен также изменится и для клиентов использующих ModifyCalc(поэтому простое 
 
 --вытаскивание текста и создание оптимально процедуры, черевата разными алгоритмами)
 
 --И в дальнейшем(через некий временной промежуток,когда уже все работает у клиентов) ставится точно такая же проблемма
 
 --перед InetCalc
 
EXEC InetCalc

Почему это не работает? Кто знает ответ при котором этот алгоритм может работать, напоминаю клиентов(app приложения) менять нельзя. Писал как-то об этом в microsoft года 4 назад, так там и ухом не повели, типа это не к нам и куда-то перенаправили ссылки нет как и письма тоже
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072432
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вложенный INSERT EXEC является одним их ограничений.
Перепишите код по-человечески и проблема исчезнет.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072441
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jimmers тут ясно же выложена проблемма, переписать нет возможности! Исправление процедур заставит изменить
КЛИЕНТСКИЕ ПРИЛОЖЕНИЯ! Вы у себя там все в одиночку пишите?
Лично у нас такого нет! И программисты те уже разъехались кто-куда еще с 99-2000год. Приложения написаны на разных языках VC(DB-Library),VB(DB-Library),Access(ODBC). Вам интересно заново сидеть за ними? При решение третьей проблеммы пришлось просто перетаскивать код.
По человечески дураку понятно, а как в жизни бывает.
Вот у вас не дай бог конечно разбежится народ и такое же будет.
Я задаюсь вопросом BUG это или нет! Синтаксически здесь все правильно.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072445
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ на Ваш вопрос - это НЕ баг. Это ограничение SQL Server'а.
А вот то, что код написан без учета этой особенности - это
действительно баг. Перепишите.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072465
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Flint-San
на: Синтаксически здесь все правильно.

Вот есть такое ограничение на количество вызываемых друг-из-друга процедур:


Nesting occurs when one stored procedure calls another. The nesting level is incremented when the called procedure begins execution, and it is decremented when the called procedure has finished. Exceeding the maximum of 16 nesting levels causes the whole calling procedure chain to fail.


Синтаксически вы можете написать хоть 25 вложенных вызовов... А практически - ровно на 16-ом получите ошибку времени исполнения, это чей баг?
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072470
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qu-qu ну так это ограничение хорошо расписано в BOL и там ясно написано нельзя. Что же касается:
INSERT #tbl
EXEC sp1
от версии к версии SQL, я не встретил ни в одном BOL описание на ограничении вложености при таком выполнении. Можете мне показать это ограничение в BOL?
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072473
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откройте Books Online:

8164 16 An INSERT/EXEC statement cannot be nested.

либо

8164 16 An INSERT EXEC statement cannot be nested.


То есть, об этом ограничении давно известно. Другой вопрос, почему
о нем так мало информации, кроме констатации факта. Видимо потому,
что до недавнего времени (вроде в 7-ке еще) INSERT ... EXEC не был
документирован, хотя я не уверен.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072518
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INSERT ... EXEC не было в 4.0 (и недокументированного в т.ч.), в 6.0 он уже был документирован.

очевидно предпологалось, что его будут использовать для передачи данных с одного сервера на другой, поэтому на таких проблеммах не останавливались
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072536
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и есть, очень часто делали выполнение таких скриптов и брали данные с одного сервера 6.5(RPC) на другой 6.5.
В BOL 6.5 столь мало значимая строчка (8630) sysmessages отсутствует.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072540
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправка:
В BOL 6.5 столь мало значимая строчка (8164) sysmessages отсутствует.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072546
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Flint-San:

Правильно, отсутствует. Зато она есть здесь: Q187491

2SergSuper:

Не знаю, где-то я читал вроде, что INSERT ... EXEC в BOL (в части описания INSERT) не был ранее описан. К сожалению, проверить на 7-ке не могу... Может и ошибаюсь.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072711
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 jimmers

INSERT ... EXEC в BOL (в части описания INSERT как T-SQL) есть в 7. Даже пример приведен. Но вот о том, что нельзя использовать вложенные INSERT ... EXEC там скромно умалчивается.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32072861
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВладимирМ

INSERT ... EXEC в BOL (в части описания INSERT как T-SQL) есть даже в 6.5 (только в разделе "What's New!"). Даже пример приведен. Но вот о том, что нельзя использовать вложенные INSERT ... EXEC там точно так же скромно умалчивается.
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32073226
Сергей АБ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Flint-San
А какая версия MSSQLServer? Если 2000, то можно легко вопрос решить применением функций (UDF), например:

create function funcSourceCalc()
returns @t1 table (fld1 int)
as
begin
insert into @t1(fld1) values(100)
return
end
go

create PROC SourceCalc as select * from dbo.funcSourceCalc()

GO

create function funcModifyCalc()
returns @t1 table (fld1 int)
as
begin
insert into @t1 (fld1)
select * from dbo.funcSourceCalc()
update @t1 set fld1=fld1*100
return
end
go


create PROC ModifyCalc as select * from dbo.funcModifyCalc()

GO


create function funcInetCalc()
returns @t1 table (fld1 int)
as
begin
insert into @t1 (fld1)
select * from dbo.funcModifyCalc()
update @t1 set fld1=fld1+1
return
end
go


create PROC InetCalc as select * from dbo.funcInetCalc()

GO
...
Рейтинг: 0 / 0
Опытным пользователям SQL. BUG или нет?
    #32073337
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
openrowset/openquery....
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Опытным пользователям SQL. BUG или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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