Сервер Sql - как вставить одну строку во временную таблицу?

У меня есть две временные таблицы, когда я просматриваю одну таблицу и получаю из нее некоторые значения, в этом цикле мне нужно вставить новую строку в другую временную таблицу. Это возможно. Вот мой код sql и информация об ошибке:

Alter PROCEDURE ProfitReportQ_Search_WithSub 
(@DateFrom datetime,
 @DateTo datetime,
 @DateActive bit,
 @UserID int,
 @ItemGroupIDValues nvarchar(max)
)
AS
BEGIN
CREATE TABLE #tmp(ItemGroupID int, ItemGroupName nvarchar(250), Manager nvarchar(250), AllQuantity int, AllSumPrice AllSumPrice, AllSumPriceWithVAT decimal(18,4), Profit decimal(18,4))
CREATE TABLE #tmp2(Manager nvarchar(250), AllQuantity int, AllSumPrice decimal(18,4), AllSumPriceWithVAT decimal(18,4), Profit decimal(18,4), ItemGroupNameRoot nvarchar(250))


INSERT INTO #tmp
    EXEC ProfitReportQ_Search @DateFrom, @DateTo, @DateActive, @UserID, @ItemGroupIDValues

DECLARE @ItemGroupID int
DECLARE @ItemGroupName nvarchar(250)
DECLARE @Manager nvarchar(250)
DECLARE @AllQuantity int
DECLARE @AllSumPrice decimal(18,4)
DECLARE @AllSumPriceWithVAT decimal(18,4)
DECLARE @Profit decimal(18,4)
DECLARE @ItemGroupNameRoot nvarchar(250)
DECLARE @count int

SET @count = (SELECT COUNT(*) FROM #tmp)
WHILE (@count <> 0)
BEGIN
    SELECT TOP (1) @ItemGroupID = ItemGroupID, @ItemGroupName = ItemGroupName, @Manager = Manager, @AllQuantity = AllQuantity, @AllSumPrice = AllSumPrice, @AllSumPriceWithVAT = AllSumPriceWithVAT, @Profit = Profit FROM #tmp
    DELETE #tmp WHERE ItemGroupID = ItemGroupID AND ItemGroupName = @ItemGroupName AND Manager = @Manager AND AllQuantity = @AllQuantity AND AllSumPrice = @AllSumPrice AND AllSumPriceWithVAT = @AllSumPriceWithVAT AND Profit = @Profit



    INSERT INTO #tmp2 (Manager, AllQuantity, AllSumPrice, AllSumPriceWithVAT, Profit, ItemGroupNameRoot )
        VALUES (@Manager, @AllQuantity, @AllSumPrice, @AllSumPriceWithVAT, @Profit, EXEC ItemGroup_GetRootWithRecurse @ItemGroupID)
END


SELECT ItemGroupNameRoot, Manager, SUM(AllQuantity) AS AllQuantity, SUM(AllSumPrice) AS AllSumPrice, 
        SUM(AllSumPriceWithVAT) AS AllSumPriceWithVAT, SUM(Profit) AS Profit
FROM #tmp2
GROUP BY ItemGroupNameRoot, Manager

DELETE #tmp
DELETE #tmp2

END
GO

Есть проблема с этими строками:

    INSERT INTO #tmp2 (Manager, AllQuantity, AllSumPrice, AllSumPriceWithVAT, Profit, ItemGroupNameRoot )
        VALUES (@Manager, @AllQuantity, @AllSumPrice, @AllSumPriceWithVAT, @Profit, EXEC ItemGroup_GetRootWithRecurse @ItemGroupID)

Ошибка:

Неверный синтаксис рядом с ключевым словом «EXEC». Неправильный синтаксис рядом с ')'.

Некоторые идеи?


person Vytas    schedule 05.08.2009    source источник


Ответы (3)


У меня не было возможности поместить эти значения в #temp2, когда он выполнялся в другом SP. Я работал с тремя временными таблицами, например:

НАЧИНАТЬ

CREATE TABLE #tmp(ItemGroupID int, ItemGroupName nvarchar(250), 
                    Manager nvarchar(250), AllQuantity int, 
                    AllSumPrice decimal(18,4), AllSumPriceWithVAT decimal(18,4), 
                    Profit decimal(18,4), ID int
                    )
CREATE TABLE #tmp2(Manager nvarchar(250), AllQuantity int, 
                    AllSumPrice decimal(18,4), AllSumPriceWithVAT decimal(18,4), 
                    Profit decimal(18,4), ItemGroupNameRoot nvarchar(250)
                    )

CREATE TABLE #tmp3(ItemGroupNameRoot nvarchar(250))


INSERT INTO #tmp
    EXEC ProfitReportQ_Search_v2 @DateFrom, @DateTo, @DateActive, @UserID, @ItemGroupIDValues

DECLARE @ID int
DECLARE @ItemGroupID int
DECLARE @ItemGroupName nvarchar(250)
DECLARE @Manager nvarchar(250)
DECLARE @AllQuantity int
DECLARE @AllSumPrice decimal(18,4)
DECLARE @AllSumPriceWithVAT decimal(18,4)
DECLARE @Profit decimal(18,4)
DECLARE @ItemGroupNameRoot nvarchar(250)
DECLARE @count int

SET @count = (SELECT COUNT(*) FROM #tmp)
WHILE (@count <> 0)
BEGIN
    SELECT TOP (1) @ItemGroupID = ItemGroupID, @ItemGroupName = ItemGroupName, @Manager = Manager, @AllQuantity = AllQuantity, @AllSumPrice = AllSumPrice, @AllSumPriceWithVAT = AllSumPriceWithVAT, @Profit = Profit, @ID = ID 
    FROM #tmp
    DELETE #tmp WHERE ID = @ID

    INSERT INTO #tmp3 EXEC ItemGroup_GetRootWithRecurse_ForProfitReport @ItemGroupID
    SELECT TOP(1)@ItemGroupNameRoot = ItemGroupNameRoot 
    FROM #tmp3


    INSERT INTO #tmp2 SELECT @Manager, @AllQuantity, 
                    @AllSumPrice, @AllSumPriceWithVAT, 
                    @Profit, @ItemGroupNameRoot
    DELETE #tmp3
    SET @count = (SELECT COUNT(*) FROM #tmp)
END
DELETE #tmp
SELECT ItemGroupNameRoot, Manager, SUM(AllQuantity) AS AllQuantity, SUM(AllSumPrice) AS AllSumPrice, 
        SUM(AllSumPriceWithVAT) AS AllSumPriceWithVAT, SUM(Profit) AS Profit
FROM #tmp2
GROUP BY ItemGroupNameRoot, Manager
DELETE #tmp2

КОНЕЦ

person Vytas    schedule 06.08.2009
comment
Также я пробовал использовать глобальную временную таблицу (##tmp), это тоже не сработало, поэтому основной вопрос меняется на Как разделить временную таблицу между хранимыми процедурами? - person Vytas; 06.08.2009

Похоже, вы пытаетесь вставить результат следующего в столбец ItemGroupNameRoot #tmp2:

EXEC ItemGroup_GetRootWithRecurse @ItemGroupID

Вы действительно не можете выполнять хранимые процедуры и использовать результаты таким образом. Вместо этого я предлагаю заменить хранимую процедуру ItemGroup_GetRootWithRecurse определяемой пользователем функцией. Это может выглядеть примерно так:

CREATE FUNCTION ItemGroup_GetRootWithRecurse_Function (@ItemGroupID int)
RETURNS varchar(30)
AS
BEGIN
declare @Return varchar(30)
select @return = case @ItemGroupID
when 1 then 'One'
when 2 then 'Two'
else 'Three'
end

return @return
end

Вы бы вызывали функцию почти так же, как и хранимую процедуру. Большая разница в том, что вы отбрасываете оператор EXEC, поэтому вызов выглядит так:

dbo.ItemGroup_GetRootWithRecurse_Function (@ItemGroupID)

Надеюсь, это поможет.

person Ben Griswold    schedule 05.08.2009
comment
Это проблема с рекурсией, я не могу использовать этот sql-материал. Моя рекурсия sql в ItemGroup_GetRootWithRecurse выглядит так (второй комментарий) - person Vytas; 05.08.2009
comment
@ItemGroupID int AS BEGIN WITH recurseUp AS (SELECT ItemGroupID, ParentID, ItemGroupName FROM dbo.ItemGroup WHERE ItemGroupID = @ItemGroupID UNION ALL SELECT b.ItemGroupID, b.ParentID, b.ItemGroupName FROM recurseUp AS a ВНУТРЕННЕЕ СОЕДИНЕНИЕ dbo.ItemGroup AS b ON a.ParentID = b.ItemGroupID) ВЫБЕРИТЕ ItemGroupID, ItemGroupName FROM recurseUp AS recurseUp_1 WHERE (ParentID IS NULL) END - person Vytas; 05.08.2009
comment
Проблема в том, что функция не поддерживает предложение. - person Vytas; 05.08.2009
comment
Понял. Я не нашел никаких ссылок на рекурсию, являющуюся проблемой в вашем вопросе. Извините, я ничем не помог. - person Ben Griswold; 05.08.2009

краткий ответ:
вы можете совместно использовать временную таблицу, созданную в хранимой процедуре, с хранимой процедурой, которую она вызывает. Вы можете попробовать использовать эту технику для вставки в #temp2 в ItemGroup_GetRootWithRecurse.

длинный ответ:
это может помочь: Как обмениваться данными между Хранимые процедуры. Вы можете прочитать всю статью, но связанный раздел о совместном использовании временных таблиц между процедурами может помочь.

вы можете передать @Manager, @AllQuantity, @AllSumPrice, @AllSumPriceWithVAT, @Profit, а также @ItemGroupID в ItemGroup_GetRootWithRecurse, а внутри вставить в #tmp2 что-то вроде:

WITH recurseUp AS 
(
SELECT ItemGroupID, ParentID, ItemGroupName 
FROM dbo.ItemGroup 
WHERE ItemGroupID = @ItemGroupID 

UNION ALL 
SELECT b.ItemGroupID, b.ParentID, b.ItemGroupName 
FROM recurseUp AS a 
INNER JOIN dbo.ItemGroup AS b ON a.ParentID = b.ItemGroupID
) 
INSERT INTO #temp2 (Manager, AllQuantity, AllSumPrice, AllSumPriceWithVAT, Profit, ItemGroupNameRoot )
SELECT @Manager, @AllQuantity, @AllSumPrice, @AllSumPriceWithVAT, @Profit, ItemGroupName 
FROM recurseUp AS recurseUp_1 WHERE (ParentID IS NULL) END 

этот код может немного отличаться, так как у меня нет всех деталей, но должен быть близок.

person KM.    schedule 05.08.2009