簡體   English   中英

SQL Server-如何將單行插入臨時表?

[英]Sql server - how to insert single row into temporary table?

我有兩個臨時表,當我循環瀏覽一個表並從中獲得一些值時,在這個循環中,我需要將新行插入到另一個臨時表中。 這可能嗎。 這是我的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”附近的語法不正確。 ')'附近的語法不正確。

有什么想法嗎?

在另一個SP中執行時,我無法將這些值放入#temp2中。 我制定了三個臨時表,如下所示:

開始

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

結束

似乎您正在嘗試將以下結果插入#tmp2的ItemGroupNameRoot列中:

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)

我希望這有幫助。

簡短答案:
您可以將在存儲過程中創建的臨時表與其調用的存儲過程共享。 您可以嘗試使用此技術插入ItemGroup_GetRootWithRecurse中的#temp2。

長答案:
這可能會有所幫助: 如何在存儲過程之間共享數據 您可以閱讀整篇文章,但是有關在過程之間共享臨時表的鏈接部分卻可以解決問題。

您可以將@ 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 

這段代碼可能有點過時了,因為我沒有其他細節,但是應該很接近。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM