2012-06-06 28 views
3

您好我目前正在創建My SP,根據我的select語句給出的結果插入和檢測記錄。當使用CTE執行CRUD操作時,無效的對象名稱'Table'

這是我的示例代碼:

DECLARE @PickListBatchName varchar(200), 
@PartNumber varchar(50), 
@QTY int; 

SET @PickListBatchName='TEST1'; 
SET @PartNumber='PN1'; 
SET @QTY=1; 


     --STEP 1 Add Result to TempTable 
     With SN as 
     (
     SELECT TOP (@QTY) 
      pb.PickListBatchId 
      ,pt.PickListTRANId 
      ,pt.SerialNumber 
      ,pt.Createdby 
      ,pt.CreatedDT 
FROM PickListTRAN pt 
      LEFT JOIN PickListBatchDetail pdb ON pdb.PickListBatchDetailId=pt.PickListBatchDetailId 
      LEFT JOIN PickListBatch pb ON pdb.PickListBatchId=pb.PickListBatchId 
where [email protected] AND [email protected] 
    ) 


    --STEP 2: INSERT SN TO PicklistTranCancel 
    INSERT INTO PickListTRANCancel 
    (
    PickListBatchId 
    ,SerialNumber 
    ,CreatedBy 
    ,CreatedDT 
    ) 
    (SELECT 
      PickListBatchId, 
      SerialNumber, 
      Createdby, 
      CreatedDT 
    FROM SN); 

    --STEP 3: DELETE Records on PicklistTran 

    DELETE FROM PicklistTran where picklistTranId IN (SELECT PickListTRANId FROM SN) 

結果:

(1 row(s) affected) 
Msg 208, Level 16, State 1, Line 49 
Invalid object name 'SN'. --error on delete statement 

在步驟3,delete語句無法讀取SN表。也許我錯過了那部分的東西。

謝謝問候

回答

1

感謝@benni_mac_b和@praveen這是我的嘗試。我只是用來創建TempTable而不是使用WITH。

DECLARE @PickListBatchName varchar(200), 
@PartNumber varchar(50), 
@QTY int; 

SET @PickListBatchName='TEST1'; 
SET @PartNumber='PN1'; 
SET @QTY=1; 

Declare @MyTable table 
(
    PickListBatchId int, 
    PickListTRANId int, 
    SerialNumber varchar(50), 
    Createdby varchar(50), 
    CreatedDT datetime 
); 


--STEP 1: insert to temptable 
INSERT INTO @MyTable 
        (
      PickListBatchId, 
      PickListTRANId, 
      SerialNumber, 
      Createdby, 
      CreatedDT 
        ) 
SELECT TOP (@QTY) 
      pb.PickListBatchId 
      ,pt.PickListTRANId 
      ,pt.SerialNumber 
      ,pt.Createdby 
      ,pt.CreatedDT 
FROM PickListTRAN pt 
      LEFT JOIN PickListBatchDetail pdb ON pdb.PickListBatchDetailId=pt.PickListBatchDetailId 
      LEFT JOIN PickListBatch pb ON pdb.PickListBatchId=pb.PickListBatchId 
where [email protected] AND [email protected] 


    --STEP 2: INSERT SN TO PicklistTranCancel 
    INSERT INTO PickListTRANCancel 
    (
    PickListBatchId 
    ,SerialNumber 
    ,CreatedBy 
    ,CreatedDT 
    ) 
    SELECT 
    PickListBatchId, 
    SerialNumber, 
    Createdby, 
    CreatedDT 
    FROM @MyTable 

    --STEP 3: DELETE 
    DELETE FROM PicklistTran where picklistTranId IN (SELECT PickListTRANId FROM @MyTable) 
6

在你的代碼CTE只是直到插入語句訪問。如果您需要訪問CTE表,嘗試將CTE數據填充到一個@TempTable,然後訪問它在你的DELETE語句。你可以修改代碼的值存儲到一個臨時表

INSERT INTO PickListTRANCancel 

    (
    PickListBatchId 
    ,SerialNumber 
    ,CreatedBy 
    ,CreatedDT 
) 
Output Inserted.PickListBatchId,Inserted.SerialNumber,Inserted.CreatedBy, 
Inserted.CreatedDT into @TempTable 
    (SELECT 
     PickListBatchId, 
     SerialNumber, 
     Createdby, 
     CreatedDT 
FROM SN); 

    DELETE FROM PicklistTran where picklistTranId IN 
    (SELECT PickListTRANId FROM @TempTable) 

我的天堂不驗證代碼,但這樣你可以構建你的查詢。

0

CTE範圍僅適用於一個語句,您不能使用它兩次。您可以使用臨時表來存儲CTE的值

相關問題