2013-04-18 1 views
2

SQL Server Management Studio 2008에 있는데이 쿼리를 통해 여러 OrderID를 설정하려고합니다. TempTable을 사용해야한다고 들었지만 여러 테이블 변수를 설정하는 방법에 어려움이 있습니다. 여러 테이블 변수를 사용하여 SQL에서 로컬 #temptable을 채우십시오.

DECLARE @OrderID int 
DECLARE @Status int 

-- FF nummer 
SET @OrderID = 134 
-- Huidige status 
SET @Status = 4 

BEGIN TRANSACTION 

UPDATE FF_Task 
SET    tsk_FK_CurrentStatus = NULL 
WHERE  (tsk_FK_Order = @OrderID) 

UPDATE FF_Order 
SET    ord_FK_CurrentOrderStatus = NULL 
WHERE  (ord_PK = @OrderID) 

DELETE FROM FF_StatusLog 
WHERE  (stl_PK IN 
    (SELECT  TOP (1) FF_StatusLog_1.stl_PK 
    FROM   FF_StatusLog AS FF_StatusLog_1 INNER JOIN 
    FF_Task ON FF_StatusLog_1.stl_FK_Task = FF_Task.tsk_PK 
    WHERE  (FF_Task.tsk_FK_Order = @OrderID) 
    ORDER BY FF_StatusLog_1.stl_PK DESC)) 

DELETE 
FROM   FF_OrderStatusLog 
WHERE  (osl_Status = @Status) AND (osl_FK_Order = @OrderID)        

UPDATE FF_Task 
SET 
tsk_FK_CurrentStatus = (SELECT  TOP (1) FF_StatusLog_1.stl_PK 
         FROM   FF_StatusLog AS FF_StatusLog_1 INNER JOIN 
         FF_Task ON FF_StatusLog_1.stl_FK_Task = FF_Task.tsk_PK 
         WHERE  (FF_Task.tsk_FK_Order = @OrderID) 
         ORDER BY FF_StatusLog_1.stl_PK DESC) 
         WHERE  (tsk_FK_Order = @OrderID) 

UPDATE FF_Order 
SET    ord_FK_CurrentOrderStatus = (SELECT TOP 1 osl_Status FROM 
       FF_OrderStatusLog WHERE (osl_FK_Order = @OrderID) ORDER BY osl_CreationDateTime DESC) 
WHERE  (ord_PK = @OrderID) 
COMMIT TRANSACTION 

감사합니다 : 이 내가 사용하는 원래의 쿼리입니다.

+1

어떤 SQL Server 버전을 사용하고 있습니까? 그러면 orderID 테이블을 매개 변수로 사용할 수 있는지 또는 매개 변수를 orderID의 CSV 목록으로 변환해야하는지 여부가 결정됩니다. 또는 저장 프로 시저가 아닌 일회성 쿼리 인 경우 저장 프로 시저를 생략 할 수 있습니다. –

+0

MS SQL Server Management Studio 2008 – Dave

+0

일회성 쿼리입니다. (그러나 1 년 동안 여러 번 사용됨) – Dave

답변

2

당신은 테이블 변수 또는 임시 테이블 SQLServer2008 +에서 또한

당신의 SP에 table-valued parameters을 통과 할 수 있으며 UDFs.A 테이블 값 매개 변수는 표 형식으로 귀하의 SP 및 UDF의 데이터의 행을 전달할 수 있습니다 사용할 수 있습니다. 테이블 반환 매개 변수를 만들려면 먼저 테이블 구조를 정의하는 테이블 형식을 만들어야합니다.

DECLARE @TableOfParemeters TABLE(OrderID int, Status int) 
INSERT @TableOfParemeters 
VALUES(134, 4), 
     (135, 5) 

BEGIN TRANSACTION 

UPDATE FF_Task 
SET tsk_FK_CurrentStatus = NULL 
WHERE tsk_FK_Order IN (SELECT OrderID FROM @TableOfParemeters) 

UPDATE FF_Order 
SET ord_FK_CurrentOrderStatus = NULL 
WHERE ord_PK IN (SELECT OrderID FROM @TableOfParemeters) 

;WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY stl_PK ORDER BY stl_PK DESC) AS rn 
    FROM FF_StatusLog stl INNER JOIN FF_Task ff ON stl.stl_FK_Task = ff.tsk_PK 
    WHERE ff.tsk_FK_Order IN (SELECT OrderID FROM @TableOfParemeters) 
) 
    DELETE cte 
    WHERE rn = 1 

DELETE 
FROM FF_OrderStatusLog 
WHERE EXISTS (
       SELECT 1 
       FROM @TableOfParemeters t 
       WHERE osl_Status = t.Status AND osl_FK_Order = t.OrderID 
      ) 

;WITH cte AS 
(
    SELECT stl.stl_PK, ff.tsk_FK_CurrentStatus, 
     ROW_NUMBER() OVER(PARTITION BY stl_PK ORDER BY stl_PK DESC) AS rn 
    FROM FF_StatusLog stl INNER JOIN FF_Task ff ON stl.stl_FK_Task = ff.tsk_PK 
    WHERE ff.tsk_FK_Order IN (SELECT OrderID FROM @TableOfParemeters) 
) 
    UPDATE cte 
    SET tsk_FK_CurrentStatus = stl_PK 
    WHERE rn = 1 

;WITH cte AS 
(
    SELECT o.ord_FK_CurrentOrderStatus, l.osl_Status, 
     ROW_NUMBER() OVER(PARTITION BY osl_Status ORDER BY osl_CreationDateTime DESC) AS rn 
    FROM FF_Order o INNER JOIN FF_OrderStatusLog l ON o.ord_PK = l.osl_FK_Order 
    WHERE l.osl_FK_Order IN (SELECT OrderID FROM @TableOfParemeters) 
) 
    UPDATE cte 
    SET tsk_FK_CurrentStatus = osl_Status 
    WHERE rn = 1 

COMMIT TRANSACTION 
관련 문제