Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенные ХП / 25 сообщений из 25, страница 1 из 1
26.09.2002, 15:31:17
    #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
26.09.2002, 15:46:22
    #32053362
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
Код в сдудию!
...
Рейтинг: 0 / 0
26.09.2002, 15:47:50
    #32053363
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
Это ограничение SQL Server'а.
...
Рейтинг: 0 / 0
26.09.2002, 15:54:37
    #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
26.09.2002, 16:06:25
    #32053372
UNIVERSAL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
То есть извините я код первой процедуры 2- раза вставил. Не пугайтесь пжлста.
...
Рейтинг: 0 / 0
26.09.2002, 16:07:28
    #32053373
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
В этой строке ошибка?
Код: plaintext
INSERT INTO  #TEMP1  EXEC dbo.usp_subreport_pfp_form @TableFact, @FactField , @DateFactField,  @TablePlan, @PlanField , @DatePlanField  , @BeginDate, @EndDate, 0 ,@Filter

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

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

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

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

Как заставить вставить данные в одной хранимой процедуре, возвращаемые другой? Вот в чём вопрос.
...
Рейтинг: 0 / 0
26.09.2002, 17:03:50
    #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
26.09.2002, 17:11:34
    #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
26.09.2002, 17:18:02
    #32053409
UNIVERSAL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
Вообще-то я думал, что локальные временные таблицы существуют в контексте хранимой процедуры, как и её переменные.
...
Рейтинг: 0 / 0
26.09.2002, 17:22:34
    #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
26.09.2002, 17:28:22
    #32053421
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
2 Nickolay
Если выполнить sp_lock отдельно мы увидим, что эта процедура не выдаёт никаких сообщений, кроме рекордсета. Что будет, если пр-ра возвратит два рекордсета или принты?

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

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

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

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

Пробуйте варианты с OPENQUERY или OPENROWSET.
...
Рейтинг: 0 / 0
26.09.2002, 19:22:41
    #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
27.09.2002, 10:04:04
    #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
27.09.2002, 10:26:15
    #32053553
UNIVERSAL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
Спасибо всем, кто ответил, в частности помог советом ВладимирМ . Всё заработало. Действительно нельзя в вызываемой процедуре использовать Insert .... Exec ... , если в вызывающей также вызывается вызываемая ( :-)))) , если кто-то понял что я тут написал.)
...
Рейтинг: 0 / 0
27.09.2002, 11:20:57
    #32053573
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенные ХП
2Jimmy: да я это не со зла, просто сам об этом недавно узнал, вот и решил поделится с народом может кому сгодится...

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

Да я и не думал, что со зла :0)
Просто вчера, спасибо тебе , узнал что-то новое.
А чтобы потом (мне!) неповадно было непроверенные советы давать, я себя так и охарактеризовал.
...
Рейтинг: 0 / 0
27.09.2002, 12:17:25
    #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
27.09.2002, 14:50:02
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенные ХП / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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