2016-01-11 53 views
0

我想從我的查詢中刪除#temp1,並將它用作另一個表變量,它的工作原理與使用#temp1表相同。 這裏是我的查詢使用sqlserver將臨時表更改爲表變量2012

DROP TABLE #temp1 
;WITH cteSales AS(
    SELECT BillDate, 
      BillNo, 
      '-' AS  NarrationNumber, 
      TotalAmount, 
      0  AS ReceivedAmount 
    FROM SalesMaster 
    WHERE SalesMaster.ClientID = @ClientID 
      AND SalesMaster.BillDate BETWEEN @FromDate AND @ToDate 
    UNION ALL 
    SELECT [Date] AS BillDate, 
      SalesAccount.BillNo, 
      SalesAccount.NarrationNumber, 
      0  AS TotalAmount, 
      Amount AS ReceivedAmount 
    FROM SalesAccount 
      LEFT JOIN SalesMaster sm 
       ON sm.BillNo = SalesAccount.BillNO 
    WHERE sm.ClientID = @ClientID 
      AND sm.BillDate BETWEEN @FromDate AND @ToDate 
), cteFormattedSales AS(
    SELECT ROW_NUMBER() OVER(ORDER BY BillNo ASC, BillDate ASC) AS RowNum, 
      * 
    FROM cteSales 
) 

SELECT cfs1.RowNum, 
     cfs1.BillDate, 
     cfs1.BillNo, 
     cfs1.NarrationNumber, 
     cfs1.TotalAmount, 
     cfs1.ReceivedAmount, 
     (cfs1.TotalAmount - cfs1.ReceivedAmount) AS DueAmount INTO #temp1 
FROM cteFormattedSales cfs1 
DECLARE @BillDate date, 
     @PrevBillNo INT, 
     @NextBillNo INT, 
     @NarrationNumber VARCHAR(15), 
     @TotalAmount DECIMAL(18, 2), 
     @ReceivedAmount DECIMAL(18, 2), 
     @NextDue DECIMAL(18, 2), 
     @PrevDue DECIMAL(18, 2) 
DECLARE @finalTable TABLE(
      BillDate date, 
      BillNo INT, 
      NarrationNumber NVARCHAR(15), 
      TotalAmount DECIMAL(18, 2), 
      ReceivedAmount DECIMAL(18, 2), 
      DueAmount DECIMAL(18, 2) 
     ) 

DECLARE @TotalRecords  INT, 
     @Counter    INT = 1, 
     @CarryOverAmount  DECIMAL(18, 2) 

SELECT @TotalRecords = COUNT(*) 
FROM #temp1 

SELECT @BillDate = t.BillDate, 
     @PrevBillNo   = t.BillNo, 
     @NarrationNumber  = t.NarrationNumber, 
     @TotalAmount   = t.TotalAmount, 
     @ReceivedAmount  = t.ReceivedAmount, 
     @PrevDue    = t.DueAmount 
FROM #temp1 t 
WHERE t.RowNum = @Counter 

WHILE @Counter <= @TotalRecords 
BEGIN 
    SELECT @BillDate = t.BillDate, 
      @NextBillNo   = t.BillNo, 
      @NarrationNumber  = t.NarrationNumber, 
      @TotalAmount   = t.TotalAmount, 
      @ReceivedAmount  = t.ReceivedAmount, 
      @NextDue    = t.DueAmount 
    FROM #temp1 AS t 
    WHERE t.RowNum = @Counter 

    IF (@Counter = 1) 
     SET @CarryOverAmount = @TotalAmount 

    SET @PrevDue = @CarryOverAmount - @ReceivedAmount 

    IF @PrevBillNo <> @NextBillNo 
    BEGIN 
     SET @PrevBillNo = @NextBillNo 
     SET @CarryOverAmount = @TotalAmount + @PrevDue 
     SET @PrevDue = 0 
    END 

    INSERT INTO @finalTable 
     (
     BillDate, 
     BillNo, 
     NarrationNumber, 
     TotalAmount, 
     ReceivedAmount, 
     DueAmount 
    ) 
    VALUES 
     (
     @BillDate, 
     @PrevBillNo, 
     @NarrationNumber, 
     @TotalAmount, 
     @ReceivedAmount, 
     CASE 
      WHEN @NarrationNumber = '-' THEN @CarryOverAmount 
      ELSE @PrevDue 
     END 
    ) 

    IF @PrevBillNo = @NextBillNo 
    BEGIN 
     IF @Counter > 1 
     BEGIN 
      SET @CarryOverAmount = CASE 
             WHEN @NarrationNumber = '-' THEN @CarryOverAmount 
              + @PrevDue 
             ELSE @CarryOverAmount - @ReceivedAmount 
            END 
     END 
    END 

    SET @Counter = @Counter + 1 
END 
SELECT * 
FROM @finalTable 

在這裏,我得到無效ReceivedAmount錯誤代碼

SELECT @BillDate = t.BillDate, 
      @PrevBillNo   = t.BillNo, 
      @NarrationNumber  = t.NarrationNumber, 
      @TotalAmount   = t.TotalAmount, 
      @ReceivedAmount  = t.ReceivedAmount, 
      @PrevDue    = t.DueAmount 
    FROM @Temp1 t 
    WHERE t.RowNum = @Counter 

    WHILE @Counter <= @TotalRecords 
    BEGIN 
     SELECT @BillDate = t.BillDate, 
       @NextBillNo   = t.BillNo, 
       @NarrationNumber  = t.NarrationNumber, 
       @TotalAmount   = t.TotalAmount, 
       @ReceivedAmount  = t.ReceivedAmount, 
       @NextDue    = t.DueAmount 
     FROM @Temp1 AS t 
     WHERE t.RowNum = @Counter 
+0

正如你已經在查詢我不明白你的問題表變量的例子嗎?就像那些一樣做? –

+0

@Allan,我做了同樣的事情,但我只使用Table Varible而不是#temp1獲得單行,所以需要幫助來使用表變量獲得所有這些數據 –

+0

您能向我們解釋爲什麼您更願意使用*表變量*比一個*臨時表*? –

回答

1

你需要做的只是3個步驟:

A. DECLARE表變量

-- correct types of columns 
DECLARE @temp1 TABLE(
    RowNum int 
    ,BillDate datetime 
    ,BillNo int 
    ,NarrationNumber int 
    ,TotalAmount money 
    ,RecievedAmount money 
    ,DueAmount money 
) 

B.重寫SELECT ... INTO - > INSERT INTO .. SELECT

INSERT INTO @temp1 
SELECT cfs1.RowNum, 
     cfs1.BillDate, 
     cfs1.BillNo, 
     cfs1.NarrationNumber, 
     cfs1.TotalAmount, 
     cfs1.ReceivedAmount, 
     (cfs1.TotalAmount - cfs1.ReceivedAmount) AS DueAmount 
FROM cteFormattedSales cfs1 
... etc ... 

C.全部替換#temp1中,以@ temp1中

+0

獲取錯誤無效的列名ReceivedAmount,雖然我已receivedamount列在裏面 –

+0

@SanjayChaudhary:在哪一行?你能用新代碼編輯你的文章嗎? – Ingaz

+0

@SanjayChaudhary Ingaz向您解釋瞭如何將臨時表更改爲表變量所需做的基礎知識。當然你可以聽取他的建議(步驟A,B和C)並自己改變腳本? –