|
|
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Господа, помогите пожалуйста. Есть две хранимые процедуры P1 и P2. P1 вызывает P2 и в Р1 из Р2 должен вернуться набор данных, потом Р1 должна обработать этот набор данных (связать со своим набором) и вернуть модифицированный набор данных. В обеих процедурах используются локальные временные таблицы. При выполнении Р1 возникает ошибка: Server: Msg 8164, Level 16, State 1, Procedure Р1, Line ... An INSERT EXEC statement cannot be nested. Т.е. набор не может быть вставлен. Хотя, процедура Р2 отдельно отрабатывает нормально безошибок. Что делать? SQ Server 2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 15:31:17 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Это ограничение SQL Server'а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 15:47:50 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Вы просили - мы прислали.... Первая процедура. Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. Вторая процедура. Код: 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.09.2002, 15:54:37 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
То есть извините я код первой процедуры 2- раза вставил. Не пугайтесь пжлста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 16:06:25 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
В этой строке ошибка? Код: plaintext Это недопустимая конструкция. Пользуйся буферной временной таблицей или табличной переменной, или посмотри здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 16:07:28 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Буферная таблица - это глобальная временная имеется ввиду. И почему такая конструкция недопустима, если синтаксически она правильна. Кстати, если : Код: plaintext 1. 2. 3. 4. ТО ВСЁ КРУТО РАБОТАЕТ В ЧЁМ МОЯ ОШИБКА? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 16:17:00 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Сходи по ссылке (см. выше). А вопросы типа "почему недопустимо..." -> BG ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 16:23:51 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Во внутренней процедуре вместо INSERT INTO #TEMP1 EXEC(@SQLSTR) Попробуйте EXEC ('INSERT INTO #TEMP1 ' + @SQLSTR) Должно заработать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 16:44:25 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Да нет, Александр Спелицин, то что было два мессага назад работает. Не работает как раз Код: plaintext 1. Как заставить вставить данные в одной хранимой процедуре, возвращаемые другой? Вот в чём вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 16:50:23 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
2 Jimmy: а действительно, почему это недопустимая конструкция? проверь вот это : Код: plaintext 1. 2. 3. 4. - работает железобетонно !! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:03:50 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
в первой процедуре создается таблица CREATE TABLE #TEMP1 ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC(18,2) DEFAULT 0) во второй с таким же именем CREATE TABLE #TEMP1 ([DATE] DATETIME, PLAN_MONTHLY NUMERIC(18,2), FACT_MONTHLY NUMERIC(18,2)) коннект один, пространство имен одно и как это должно работать, имена то одинаковые ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:11:34 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Вообще-то я думал, что локальные временные таблицы существуют в контексте хранимой процедуры, как и её переменные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:18:02 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Кстати, пробовал создать другие процедуры, структурой похожие на эти- что удивительно всё работает. Может кто ошибку заметит. Вот код. Вызываемая процедура Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Вызывающая процедура Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:22:34 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
2 Nickolay Если выполнить sp_lock отдельно мы увидим, что эта процедура не выдаёт никаких сообщений, кроме рекордсета. Что будет, если пр-ра возвратит два рекордсета или принты? 2 UNIVERSAL По всей видимости это та же фича, что и в ADO со множественным рекордсетом и принтами. Попробуй закомментарить SET NOCOUNT OFF в процедурах. И посмотри, что первая процедура выдаёт в рекордсет и принты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:28:22 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
2 Nickolay Ну что сказать - облажался я. Начитался советов в журнале :0) 2 All readers Прошу простить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:28:47 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
насчет пространства имен CREATE Procedure TEST AS SELECT * FROM #TEMP1 CREATE TABLE #TEMP1 (ID INT, Value VARCHAR(10)) INSERT INTO #TEMP1 (ID,Value) VALUES (1,'TEST') SELECT * FROM #TEMP1 GO --процедура создалась естественно --создаем таблицу CREATE TABLE #TEMP1 (AnotherID INT) GO --запускаем процедуру получаем ошибку, так как сервер --не может выбрать таблицу EXEC TEST ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:30:51 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Как у вас со внимательностью? "An INSERT EXEC statement cannot be nested" - не может быть вложенным. Это значит, что нельзя делать INSERT EXEC для процедуры, которая внутри себя уже содержит другой INSERT EXEC. Пробуйте варианты с OPENQUERY или OPENROWSET. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 17:46:01 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Вкратце: Недопустимо использовать в конструкции INSERT вложенные EXECUTE - сработает только самый первый, а последующие дадут ошибку. Т.е. например CREATE PROCEDURE Proc1 AS ... INSERT INTO #Tab1 EXEC(@MyVar) Если запустить ее саму по себе, то проблем не будет, а если из другой процедуры INSERT INTO #Tab2 EXEC Proc1 То вот тут-то и получишь сообщение об ошибке о недопустимости вложенных EXEC в команде INSERT. Обойти это можно включив саму команду INSERT внутрь EXEC, что-то вроде SET @MyVar=@MyVar+' INSERT INTO #Tab1 ...' EXEC(@MyVar) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2002, 19:22:41 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
>>Alex_Open_m В моём случае дело не в конфликте имён таблиц, а именно скорее во вложенных Exec-ах. И, по-моему, Вы всё-таки не правы. Попробуйтесоздать две процедуры с врееменными таблицами (локальными) у которых одинаковые имена. Уверен всё будет работать. Ниже пример, который работает (SQL Srv 2000): Вызываемая процедура Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Вызывающая процедура Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. >>Akuz Если закоментарить Set Nocount Off, в вызываемой процедуре, то она ничего не возвратит, что приведёт к другого рода ошибке - уже пробовал. VVG_ Со внимательностью хорошо - со знаниями видимо не очень, поэтому и обращаюсь сюда - с такой ошибкой столкнулся 1-ый раз. ВладимирМ Большое спасибо. Вы наверное дали самый правильный ответ в данной ситуации. Хотя, конечно, спасибо всем кто ответил. Правда описанный Вами вариант обхода этой проблемы почему-то не сработал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 10:04:04 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Спасибо всем, кто ответил, в частности помог советом ВладимирМ . Всё заработало. Действительно нельзя в вызываемой процедуре использовать Insert .... Exec ... , если в вызывающей также вызывается вызываемая ( :-)))) , если кто-то понял что я тут написал.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 10:26:15 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
2Jimmy: да я это не со зла, просто сам об этом недавно узнал, вот и решил поделится с народом может кому сгодится... 2akuz: вообще-то я сказал о возможности конструкции INSERT INTO table_name EXEC sp_name и не больше. Далее уже каждый может этим пользоваться в силу своих способностей... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 11:20:57 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
2 Nickolay Да я и не думал, что со зла :0) Просто вчера, спасибо тебе , узнал что-то новое. А чтобы потом (мне!) неповадно было непроверенные советы давать, я себя так и охарактеризовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 11:37:10 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
2 Jimmy: Не мне спасибо - все мы учимся друг у друга, так что спасибо этуму сайту и его создателям (реклама SQL.RU :) ) 2ВладимирМ: я заранее извиняюсь за занудство, но ваш пример работать БУДЕТ!!! так как в нем таблицы разные - я не поленился и наколотил следующий примерчик который работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 2UNIVERSAL: проблема ,была в том, что ты пытался инсертить в ту-же самую таблицу из INSERT-а, а это неделимая операция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 12:17:25 |
|
||
|
Вложенные ХП
|
|||
|---|---|---|---|
|
#18+
Правильное решение моей проблемы. Не отделял мусор от сути, так что если кого-то это интересует, то придётся перелопатить весь мой код. Вызывающая процедура: Код: 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. Вызываемая процедура: Код: 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. ЕЩЁ РАЗ СПАСИБО ALL READERS FOR ALL ANSWERS И ПРИСОЕДИНЯЮСЬ К БЛАГОДАРНОСТИ СОЗДАТЕЛЯМ САЙТА ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2002, 14:50:02 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3407&tid=1820014]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 378ms |

| 0 / 0 |
