用多个表变量填充SQL中的本地#表变量
我在SQLServerManagementStudio 2008中,我想设置多个OrderID以通过此查询运行它们。我听说我将不得不使用一个诱人的,但我被困在如何设置多个表变量。 这是我使用的原始查询:用多个表变量填充SQL中的本地#表变量,sql,sql-server-2008,Sql,Sql Server 2008,我在SQLServerManagementStudio 2008中,我想设置多个OrderID以通过此查询运行它们。我听说我将不得不使用一个诱人的,但我被困在如何设置多个表变量。 这是我使用的原始查询: DECLARE @OrderID int DECLARE @Status int -- FF nummer SET @OrderID = 134 -- Huidige status SET @Status = 4 BEGIN TRANSACTION UPDATE FF_Task SET
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
谢谢。您可以使用表变量或临时表 在SQLServer2008+中,您还可以将数据传递给SPs和UDF。表值参数允许您以表格格式将数据行传递给SPs和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
您使用的是什么版本的SQL Server?这将决定我们是否可以使用OrderID表作为参数,或者是否需要将您的参数转换为OrderID的CSV列表。或者,如果这不是一个存储过程,而是一个一次性查询,那么请这样说,我们可以省去存储过程仪式:)MS SQL Server Management Studio 2008这是一个一次性查询(但在一年中多次使用)