powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенные ХП
25 сообщений из 25, страница 1 из 1
Вложенные ХП
    #32053352
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, помогите пожалуйста. Есть две хранимые процедуры 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
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053362
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код в сдудию!
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053363
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ограничение SQL Server'а.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053365
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы просили - мы прислали....
Первая процедура.
Код: 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.
CREATE PROCEDURE dbo.usp_subreport_pfp_form @TableFact varchar( 100 ) , @FactField varchar ( 100 ), @DateFactField varchar ( 100 ), 
                                                                                     @TablePlan  varchar( 100 ), @PlanField varchar ( 100 ), @DatePlanField varchar ( 100 ) , 
                                                                                     @BeginDate DATETIME, @EndDate DATETIME, @PERCENT BIT= 0 , @Filter VARCHAR( 100 ) ='' AS
DECLARE @SQLSTR VARCHAR( 1000 ), @S1 NUMERIC( 18 , 2 ), @S2 NUMERIC( 18 , 2 )
SET NOCOUNT ON
IF (@Filter<>'')
 BEGIN
  SET @Filter=' AND '+@Filter
 END
CREATE TABLE #TEMP ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 , FACT_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 )

SET @SQLSTR='SELECT dbo.'+@TableFact+'.'+@DateFactField+' , SUM(ISNULL(' +@FactField+',0)) AS FACT_MONTHLY FROM dbo.'+@TableFact + 
                            ' WHERE dbo.'+@TableFact+'.'+@DateFactField+'>='''+CONVERT(VARCHAR( 100 ),@BeginDate, 104 ) +
                            ''' AND ' +@DateFactField+'<='''+CONVERT( VARCHAR( 100 ),@EndDate, 104 ) +''''+@Filter+' GROUP BY '+@DateFactField
INSERT INTO #TEMP([DATE], FACT_MONTHLY)  EXEC (@SQLSTR)

CREATE TABLE #TEMP1 ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 )

SET @SQLSTR='SELECT dbo.'+ @TablePlan+'.'+@DatePlanField+' , SUM(ISNULL(' +@PlanField+',0)) AS FACT_MONTHLY FROM dbo.'+@TablePlan + 
                            ' INNER JOIN #TEMP ON #TEMP.[DATE]=dbo.'+ @TablePlan+'.'+@DatePlanField+
                            ' WHERE dbo.'+@TablePlan+'.'+@DatePlanField+'>='''+CONVERT(VARCHAR( 100 ),@BeginDate, 104 ) +
                            ''' AND dbo.'+@TablePlan+'.' +@DatePlanField+'<='''+CONVERT( VARCHAR( 100 ),@EndDate, 104 ) +''' ' +@Filter+
                            'GROUP BY dbo.'+@TablePlan+'.'+@DatePlanField
INSERT INTO #TEMP1 EXEC(@SQLSTR)

UPDATE #TEMP SET PLAN_MONTHLY=#TEMP1.PLAN_MONTHLY
FROM  #TEMP1 INNER JOIN #TEMP ON #TEMP.[DATE]=#TEMP1.[DATE]

SET @S1= 0 
SET @S2= 0 
UPDATE #TEMP SET @S1=PLAN_MONTHLY=PLAN_MONTHLY+@S1, @S2=FACT_MONTHLY=FACT_MONTHLY+@S2
FROM  #TEMP

SET NOCOUNT OFF

IF (@PERCENT= 1 )
 BEGIN
  SELECT *,  dbo.udf_getpercent(#TEMP.PLAN_MONTHLY,#TEMP.FACT_MONTHLY) AS [PERCENT] FROM #TEMP ORDER BY [DATE] ASC
 END
ELSE 
 BEGIN
  SELECT * FROM #TEMP ORDER BY [DATE] ASC  
 END

[src]
CREATE PROCEDURE dbo.usp_subreport_pfp_form @TableFact varchar( 100 ) , @FactField varchar ( 100 ), @DateFactField varchar ( 100 ), 
                                                                                     @TablePlan  varchar( 100 ), @PlanField varchar ( 100 ), @DatePlanField varchar ( 100 ) , 
                                                                                     @BeginDate DATETIME, @EndDate DATETIME, @PERCENT BIT= 0 , @Filter VARCHAR( 100 ) ='' AS
DECLARE @SQLSTR VARCHAR( 1000 ), @S1 NUMERIC( 18 , 2 ), @S2 NUMERIC( 18 , 2 )
SET NOCOUNT ON
IF (@Filter<>'')
 BEGIN
  SET @Filter=' AND '+@Filter
 END
CREATE TABLE #TEMP ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 , FACT_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 )

SET @SQLSTR='SELECT dbo.'+@TableFact+'.'+@DateFactField+' , SUM(ISNULL(' +@FactField+',0)) AS FACT_MONTHLY FROM dbo.'+@TableFact + 
                            ' WHERE dbo.'+@TableFact+'.'+@DateFactField+'>='''+CONVERT(VARCHAR( 100 ),@BeginDate, 104 ) +
                            ''' AND ' +@DateFactField+'<='''+CONVERT( VARCHAR( 100 ),@EndDate, 104 ) +''''+@Filter+' GROUP BY '+@DateFactField
INSERT INTO #TEMP([DATE], FACT_MONTHLY)  EXEC (@SQLSTR)

CREATE TABLE #TEMP1 ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 )

SET @SQLSTR='SELECT dbo.'+ @TablePlan+'.'+@DatePlanField+' , SUM(ISNULL(' +@PlanField+',0)) AS FACT_MONTHLY FROM dbo.'+@TablePlan + 
                            ' INNER JOIN #TEMP ON #TEMP.[DATE]=dbo.'+ @TablePlan+'.'+@DatePlanField+
                            ' WHERE dbo.'+@TablePlan+'.'+@DatePlanField+'>='''+CONVERT(VARCHAR( 100 ),@BeginDate, 104 ) +
                            ''' AND dbo.'+@TablePlan+'.' +@DatePlanField+'<='''+CONVERT( VARCHAR( 100 ),@EndDate, 104 ) +''' ' +@Filter+
                            'GROUP BY dbo.'+@TablePlan+'.'+@DatePlanField
INSERT INTO #TEMP1 EXEC(@SQLSTR)

UPDATE #TEMP SET PLAN_MONTHLY=#TEMP1.PLAN_MONTHLY
FROM  #TEMP1 INNER JOIN #TEMP ON #TEMP.[DATE]=#TEMP1.[DATE]

SET @S1= 0 
SET @S2= 0 
UPDATE #TEMP SET @S1=PLAN_MONTHLY=PLAN_MONTHLY+@S1, @S2=FACT_MONTHLY=FACT_MONTHLY+@S2
FROM  #TEMP

SET NOCOUNT OFF

IF (@PERCENT= 1 )
 BEGIN
  SELECT *,  dbo.udf_getpercent(#TEMP.PLAN_MONTHLY,#TEMP.FACT_MONTHLY) AS [PERCENT] FROM #TEMP ORDER BY [DATE] ASC
 END
ELSE 
 BEGIN
  SELECT * FROM #TEMP ORDER BY [DATE] ASC  
 END


Вторая процедура.
Код: 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.
CREATE PROCEDURE dbo.usp_subreport_dpf_form @TableFact varchar( 100 ) , @FactField varchar ( 100 ), @DateFactField varchar ( 100 ), 
                                                                                     @TablePlan  varchar( 100 ), @PlanField varchar ( 100 ), @DatePlanField varchar ( 100 ) ,
                                                                                     @BeginDate DATETIME, @EndDate DATETIME, @Filter varchar ( 100 ) ='' AS

DECLARE @SQLSTR VARCHAR( 1000 )
SET NOCOUNT ON
IF (@Filter<>'')
 BEGIN
  SET @Filter='  WHERE '+@Filter
 END
CREATE TABLE #TEMP ([DATE] DATETIME, [DAY] NUMERIC( 18 , 2 ))

SET @SQLSTR='SELECT dbo.'+@TableFact+'.'+@DateFactField+', '+@FactField+' FROM '+@TableFact+@Filter
INSERT INTO #TEMP([DATE], [DAY]) EXEC(@SQLSTR)

CREATE TABLE #TEMP1 ([DATE] DATETIME, PLAN_MONTHLY NUMERIC( 18 , 2 ), FACT_MONTHLY NUMERIC( 18 , 2 ))


INSERT INTO  #TEMP1  EXEC dbo.usp_subreport_pfp_form @TableFact, @FactField , @DateFactField,  @TablePlan, @PlanField , @DatePlanField  , @BeginDate, @EndDate, 0 ,@Filter
SET NOCOUNT OFF


SELECT #TEMP.[DATE], #TEMP.[DAY], #TEMP1.PLAN_MONTHLY, #TEMP1.FACT_MONTHLY  FROM #TEMP 
INNER JOIN #TEMP1 ON #TEMP.[DATE]=#TEMP1.[DATE]
GO
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053372
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть извините я код первой процедуры 2- раза вставил. Не пугайтесь пжлста.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053373
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этой строке ошибка?
Код: plaintext
INSERT INTO  #TEMP1  EXEC dbo.usp_subreport_pfp_form @TableFact, @FactField , @DateFactField,  @TablePlan, @PlanField , @DatePlanField  , @BeginDate, @EndDate, 0 ,@Filter

Это недопустимая конструкция.
Пользуйся буферной временной таблицей или табличной переменной, или посмотри здесь
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053376
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буферная таблица - это глобальная временная имеется ввиду. И почему такая конструкция недопустима, если синтаксически она правильна. Кстати, если :
Код: plaintext
1.
2.
3.
4.
DECLARE @SQLSTR VARCHAR( 1000 )
....................
SET @SQLSTR ='SELECT .................'
INSERT INTO #TEMP1 EXEC (@SQLSTR) 

ТО ВСЁ КРУТО РАБОТАЕТ
В ЧЁМ МОЯ ОШИБКА?
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053380
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сходи по ссылке (см. выше).
А вопросы типа "почему недопустимо..." -> BG
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053392
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во внутренней процедуре вместо
INSERT INTO #TEMP1 EXEC(@SQLSTR)
Попробуйте
EXEC ('INSERT INTO #TEMP1 ' + @SQLSTR)

Должно заработать
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053396
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да нет, Александр Спелицин, то что было два мессага назад работает. Не работает как раз

Код: plaintext
1.
insert into #temp1 exec <хранимая процедура, которая возвращает НД, см.выше я её ещё два раза всавил случайно.>

Как заставить вставить данные в одной хранимой процедуре, возвращаемые другой? Вот в чём вопрос.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053402
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Jimmy: а действительно, почему это недопустимая конструкция?
проверь вот это :
Код: plaintext
1.
2.
3.
4.
CREATE TABLE #locks (spid int, dbid int, objid int, objectname sysname NULL, indid int, type char( 4 ), resource char( 15 ), mode char( 10 ), status char( 6 ))
INSERT #locks (spid, dbid, objid, indid, type, resource, mode, status)
EXEC dbo.sp_lock 
SELECT * FROM #locks
DROP TABLE #locks

- работает железобетонно !!
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053405
Alex_open_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в первой процедуре создается таблица

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))

коннект один, пространство имен одно
и как это должно работать, имена то одинаковые ?
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053409
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то я думал, что локальные временные таблицы существуют в контексте хранимой процедуры, как и её переменные.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053415
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, пробовал создать другие процедуры, структурой похожие на эти- что удивительно всё работает. Может кто ошибку заметит. Вот код.
Вызываемая процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE usp_subtest AS
SET NOCOUNT ON
CREATE TABLE #T ( D DATETIME, P NUMERIC( 18 , 2 ))
INSERT INTO #T (D,P) 
SELECT INPUTDATE, PRODUCTIONOUTPUT FROM RAWMATERIALMILLSDATA
SET NOCOUNT OFF
SELECT * FROM #T
GO

Вызывающая процедура

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE PROCEDURE usp_test   AS
SET NOCOUNT ON
CREATE TABLE  #R (D DATETIME, P NUMERIC( 18 , 2 ))

INSERT INTO #R (D,P)
SELECT INPUTDATE, PRODUCTIONOUTPUT 
FROM RAWMATERIALMILLSDATA

CREATE TABLE  #R1 (D DATETIME, P NUMERIC( 18 , 2 ))

INSERT INTO #R1 EXEC USP_SUBTEST

SET NOCOUNT OFF

SELECT * FROM #R INNER JOIN #R1 ON #R1.D=#R.D
GO

...
Рейтинг: 0 / 0
Вложенные ХП
    #32053421
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Nickolay
Если выполнить sp_lock отдельно мы увидим, что эта процедура не выдаёт никаких сообщений, кроме рекордсета. Что будет, если пр-ра возвратит два рекордсета или принты?

2 UNIVERSAL
По всей видимости это та же фича, что и в ADO со множественным рекордсетом и принтами. Попробуй закомментарить SET NOCOUNT OFF в процедурах. И посмотри, что первая процедура выдаёт в рекордсет и принты.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053422
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Nickolay
Ну что сказать - облажался я. Начитался советов в журнале :0)

2 All readers
Прошу простить.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053426
Alex_open_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насчет пространства имен

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
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053431
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как у вас со внимательностью?

"An INSERT EXEC statement cannot be nested" - не может быть вложенным.

Это значит, что нельзя делать INSERT EXEC для процедуры, которая внутри себя уже содержит другой INSERT EXEC.

Пробуйте варианты с OPENQUERY или OPENROWSET.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053455
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вкратце:

Недопустимо использовать в конструкции 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)
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053540
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Alex_Open_m
В моём случае дело не в конфликте имён таблиц, а именно скорее во вложенных Exec-ах. И, по-моему, Вы всё-таки не правы. Попробуйтесоздать две процедуры с врееменными таблицами (локальными) у которых одинаковые имена. Уверен всё будет работать.
Ниже пример, который работает (SQL Srv 2000):
Вызываемая процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE usp_subtest AS
SET NOCOUNT ON
CREATE TABLE #T ( D DATETIME, P NUMERIC( 18 , 2 ))
INSERT INTO #T (D,P) 
SELECT INPUTDATE, PRODUCTIONOUTPUT FROM RAWMATERIALMILLSDATA
SET NOCOUNT OFF
SELECT * FROM #T

GO



Вызывающая процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE PROCEDURE usp_test   AS
SET NOCOUNT ON
CREATE TABLE  #T (D DATETIME, P NUMERIC( 18 , 2 ))

INSERT INTO #T (D,P)
SELECT INPUTDATE, PRODUCTIONOUTPUT 
FROM RAWMATERIALMILLSDATA

CREATE TABLE  #T1 (D DATETIME, P NUMERIC( 18 , 2 ))

INSERT INTO #T1 EXEC USP_SUBTEST

SET NOCOUNT OFF

SELECT * FROM #T INNER JOIN #T1 ON #T1.D=#T.D
GO



>>Akuz
Если закоментарить Set Nocount Off, в вызываемой процедуре, то она ничего не возвратит, что приведёт к другого рода ошибке - уже пробовал.


VVG_
Со внимательностью хорошо - со знаниями видимо не очень, поэтому и обращаюсь сюда - с такой ошибкой столкнулся 1-ый раз.


ВладимирМ
Большое спасибо. Вы наверное дали самый правильный ответ в данной ситуации. Хотя, конечно, спасибо всем кто ответил. Правда описанный Вами вариант обхода этой проблемы почему-то не сработал.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053553
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, кто ответил, в частности помог советом ВладимирМ . Всё заработало. Действительно нельзя в вызываемой процедуре использовать Insert .... Exec ... , если в вызывающей также вызывается вызываемая ( :-)))) , если кто-то понял что я тут написал.)
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053573
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Jimmy: да я это не со зла, просто сам об этом недавно узнал, вот и решил поделится с народом может кому сгодится...

2akuz: вообще-то я сказал о возможности конструкции
INSERT INTO table_name EXEC sp_name
и не больше. Далее уже каждый может этим пользоваться в силу своих способностей...
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053588
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Nickolay

Да я и не думал, что со зла :0)
Просто вчера, спасибо тебе , узнал что-то новое.
А чтобы потом (мне!) неповадно было непроверенные советы давать, я себя так и охарактеризовал.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053613
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
CREATE TABLE #a ( a varchar (  32  ))
CREATE TABLE #b ( b int )
GO
CREATE PROCEDURE p 
AS
INSERT #b VALUES(  1  )
INSERT #b VALUES(  2  )
INSERT #b VALUES(  3  )
INSERT #b VALUES(  4  )
SELECT 'it''s working'
GO
INSERT #a EXEC p

SELECT * FROM #a
SELECT * FROM #b

DROP TABLE #a
DROP TABLE #b
DROP PROCEDURE p


2UNIVERSAL: проблема ,была в том, что ты пытался инсертить в ту-же самую таблицу из INSERT-а, а это неделимая операция.
...
Рейтинг: 0 / 0
Вложенные ХП
    #32053699
UNIVERSAL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильное решение моей проблемы. Не отделял мусор от сути, так что если кого-то это интересует, то придётся перелопатить весь мой код.
Вызывающая процедура:
Код: 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.
CREATE PROCEDURE dbo.usp_subreport_dpf_form @TableFact varchar( 100 ) , @FactField varchar ( 100 ), @DateFactField varchar ( 100 ), 
                                                                                     @TablePlan  varchar( 100 ), @PlanField varchar ( 100 ), @DatePlanField varchar ( 100 ) ,
                                                                                     @BeginDate DATETIME, @EndDate DATETIME, @Filter varchar ( 100 ) ='' AS

DECLARE @SQLSTR VARCHAR( 1000 )
SET NOCOUNT ON
IF (@Filter<>'')
 BEGIN
  SET @Filter='  WHERE '+@Filter
 END
CREATE TABLE #TEMP ([DATE] DATETIME, [DAY] NUMERIC( 18 , 2 ))

SET @SQLSTR='SELECT dbo.'+@TableFact+'.'+@DateFactField+', SUM(ISNULL('+@FactField+',0)) FROM '+@TableFact+@Filter +' GROUP BY  dbo.'+@TableFact+'.'+@DateFactField
INSERT INTO #TEMP([DATE], [DAY]) EXEC(@SQLSTR)


CREATE TABLE #TEMP1 ([DATE] DATETIME, PLAN_MONTHLY NUMERIC( 18 , 2 ), FACT_MONTHLY NUMERIC( 18 , 2 ))

INSERT INTO  #TEMP1([DATE], PLAN_MONTHLY , FACT_MONTHLY)  
EXEC usp_subreport_pfp_form  @TableFact,  @FactField, @DateFactField, @TablePlan, @PlanField, @DatePlanField, @BeginDate, @EndDate,  0 

SET NOCOUNT OFF

SELECT #TEMP.[DATE], #TEMP.[DAY], #TEMP1.PLAN_MONTHLY, #TEMP1.FACT_MONTHLY  FROM #TEMP 
INNER JOIN #TEMP1 ON #TEMP.[DATE]=#TEMP1.[DATE]
GO

Вызываемая процедура:
Код: 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.
CREATE PROCEDURE dbo.usp_subreport_pfp_form @TableFact varchar( 100 ) , @FactField varchar ( 100 ), @DateFactField varchar ( 100 ), 
                                                                                     @TablePlan  varchar( 100 ), @PlanField varchar ( 100 ), @DatePlanField varchar ( 100 ) , 
                                                                                     @BeginDate DATETIME, @EndDate DATETIME, @PERCENT BIT= 0 , @Filter VARCHAR( 100 ) ='' AS
DECLARE @SQLSTR VARCHAR( 1000 ), @S1 NUMERIC( 18 , 2 ), @S2 NUMERIC( 18 , 2 )
SET NOCOUNT ON
IF (@Filter<>'')
 BEGIN
  SET @Filter=' AND '+@Filter
 END
CREATE TABLE #TEMP ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 , FACT_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 )

SET @SQLSTR='INSERT INTO #TEMP([DATE], FACT_MONTHLY) 
                             SELECT dbo.'+@TableFact+'.'+@DateFactField+' , SUM(ISNULL(' +@FactField+',0)) AS FACT_MONTHLY FROM dbo.'+@TableFact + 
                            ' WHERE dbo.'+@TableFact+'.'+@DateFactField+'>='''+CONVERT(VARCHAR( 100 ),@BeginDate, 104 ) +
                            ''' AND ' +@DateFactField+'<='''+CONVERT( VARCHAR( 100 ),@EndDate, 104 ) +''''+@Filter+' GROUP BY '+@DateFactField
 EXEC (@SQLSTR)

CREATE TABLE #TEMP1 ([DATE] DATETIME ,PLAN_MONTHLY NUMERIC( 18 , 2 ) DEFAULT  0 )

SET @SQLSTR='INSERT INTO #TEMP1 
                            SELECT dbo.'+ @TablePlan+'.'+@DatePlanField+' , SUM(ISNULL(' +@PlanField+',0)) AS FACT_MONTHLY FROM dbo.'+@TablePlan + 
                            ' INNER JOIN #TEMP ON #TEMP.[DATE]=dbo.'+ @TablePlan+'.'+@DatePlanField+
                            ' WHERE dbo.'+@TablePlan+'.'+@DatePlanField+'>='''+CONVERT(VARCHAR( 100 ),@BeginDate, 104 ) +
                            ''' AND dbo.'+@TablePlan+'.' +@DatePlanField+'<='''+CONVERT( VARCHAR( 100 ),@EndDate, 104 ) +''' ' +@Filter+
                            'GROUP BY dbo.'+@TablePlan+'.'+@DatePlanField
EXEC(@SQLSTR)

UPDATE #TEMP SET PLAN_MONTHLY=#TEMP1.PLAN_MONTHLY
FROM  #TEMP1 INNER JOIN #TEMP ON #TEMP.[DATE]=#TEMP1.[DATE]

SET @S1= 0 
SET @S2= 0 
UPDATE #TEMP SET @S1=PLAN_MONTHLY=PLAN_MONTHLY+@S1, @S2=FACT_MONTHLY=FACT_MONTHLY+@S2
FROM  #TEMP

SET NOCOUNT OFF

IF (@PERCENT= 1 )
 BEGIN
  SELECT *,  dbo.udf_getpercent(#TEMP.PLAN_MONTHLY,#TEMP.FACT_MONTHLY) AS [PERCENT] FROM #TEMP ORDER BY [DATE] ASC
 END
ELSE 
 BEGIN
  SELECT * FROM #TEMP ORDER BY [DATE] ASC  
 END
GO

ЕЩЁ РАЗ СПАСИБО ALL READERS FOR ALL ANSWERS И ПРИСОЕДИНЯЮСЬ К БЛАГОДАРНОСТИ СОЗДАТЕЛЯМ САЙТА
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенные ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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