【问题标题】:Update Variable with Case Expression and use that Variable to update table in SQL Server使用案例表达式更新变量并使用该变量更新 SQL Server 中的表
【发布时间】:2020-04-07 04:33:05
【问题描述】:

我正在尝试更新我们的运输订单的状态。它可以编译,但执行过程时没有返回任何状态。

ALTER PROCEDURE [Shipping].[UpdateShippingStatus_ERICA]
@OrderID int = 0
AS
BEGIN

declare @ShipStatus int = 0
declare @TagsVerified varchar(10) 
declare @TagCount int
declare @Cash Varchar
declare @Payment int
declare @VehicleType varchar(10)
declare @LoadedUnits varchar
declare @LoadedWeight int
select @TagCount = count(TGTAGID) from [IBM].[S10F8DCP].SALFIL.TAGCUR where TGORDER = @OrderID 
select @TagsVerified = Y6PRS09, @VehicleType = Y6CAR, @LoadedUnits = Y6PRS09, @LoadedWeight = Y6WGROSS
  from [IBM].[S10F8DCP].SALFIL.SORDHAD where Y6ONO = @OrderID
select @Cash = OHOCSH, @Payment = OHCASH from [IBM].[S10F8DCP].SALFIL.SORDH a where OHONO = @OrderID

Select  @ShipStatus = 
    (Case
        When @ShipStatus = 3 and @Cash = 'N' and @TagsVerified like '%Y%' and @TagCount = (select a.TagsLoaded from sales.IBM.OrdersShipping a where a.OrderID = @OrderID)
            Then 4

        When @ShipStatus = 3 and @Cash = 'Y' and  @Payment > '0' and @TagsVerified like '%Y%' and @TagCount = (select a.TagsLoaded from sales.IBM.OrdersShipping a where a.OrderID = '35632')
            Then 4  

        When @ShipStatus = 2 and  @LoadedUnits > '0' and @LoadedWeight > '0' 
            Then 3 

        When @ShipStatus = 1 and @VehicleType = 'VAN' and exists(select * from [IBM].[S10F8DCP].SALFIL.TRINSP where Y7ONO = @OrderID)
            Then 2 

        When exists(select * from [IBM].[S10F8DCP].SALFIL.SORDHAD where Y6LDDATE > '0' and Y6CAR <> 'VAN' and Y6ONO = @OrderID)
            Then 2

        When exists(select * from [IBM].[S10F8DCP].SALFIL.SORDHAD where Y6LDDATE > '0' and Y6CAR = 'VAN' and Y6ONO = @OrderID)
            Then 1

    End)

FROM sales.IBM.OrdersShipping a
join [IBM].[S10F8DCP].SALFIL.SORDHAD b  on b.Y6ONO = a.OrderId
join [IBM].[S10F8DCP].SALFIL.SORDH c on c.OHONO = b.Y6ONO
join [IBM].[S10F8DCP].SALFIL.TAGCUR d on d.TGORDER = c.OHONO
where OrderID = @OrderID

Update sales.ibm.ordersshipping 
set sales.ibm.ordersshipping.ShippingStatus = 
    (Case 

        When @ShipStatus = 1 Then 'READYINSP'
        When @ShipStatus = 2 Then 'READYLOAD'
        When @ShipStatus = 3 Then 'READYSCAN'
        When @ShipStatus = 4 Then 'READYSHIP'
    END)

where OrderID = @OrderID
END
GO

【问题讨论】:

  • 你没有返回任何状态是什么意思?您没有任何返回数据集或 OUTPUT 参数的 SELECT 语句,因此不确定您期望“返回”什么。
  • 我终于想通了...这是有效的代码。
  • 为什么你有所有这些变量?你没有使用它们中的大多数。你可以大大简化这个逻辑。此外,永远不要声明没有大小的 varchar !!! sql server 中的绝对值很少,但这是其中之一。它将使用默认大小。并且默认大小会因变量和参数而异,这些变量和参数会让你发疯。 sqlblog.org/2009/10/09/…
  • 据我所知,您的案例表达式中的前 4 个案例都是毫无意义的(when @ShipStatus = 3 and ... 等),您最初将其声明为 0,并且不要修改它,所以此时它始终为 0,因此它为 1、2 或 3 的情况永远不会成立。我还认为您的所有 3 个联接都是多余的,但我不能确定这一点。
  • 感谢大家的反馈 :) 学习时真的很感激。我做了更改:)

标签: sql-server case insert-update


【解决方案1】:

这是我开始工作的代码。通过“返回”,我只是表示该表没有使用当前的加载状态进行更新。就是现在。

ALTER PROCEDURE [Shipping].[UpdateShippingStatus_ERICA]
@OrderID int = ''
AS
BEGIN

declare @ShipStatus int
declare @TagsVerified varchar(4)
declare @TagCount int
declare @Cash Varchar(15)
declare @Payment int
declare @VehicleType varchar(5)
declare @LoadedUnits int
declare @LoadedWeight int
declare @Shipped Varchar(1)
declare @OHOSTS Varchar(1)
declare @LoadDate int
select @TagCount = count(TGTAGID) from [IBM].[S10F8DCP].SALFIL.TAGCUR where TGORDER = @OrderID 
select @LoadDate = Y6LDDATE, @TagsVerified = Y6PRS09, @VehicleType = Y6CAR, @LoadedUnits = Y6PRS09, @LoadedWeight = Y6WGROSS
  from [IBM].[S10F8DCP].SALFIL.SORDHAD where Y6ONO = @OrderID
select @OHOSTS = OHOSTS, @Shipped = OHSHIP, @Cash = OHOCSH, @Payment = OHCASH from [IBM].[S10F8DCP].SALFIL.SORDH a where OHONO = @OrderID

Select  @ShipStatus = 
    (Case
        When @Shipped = 'S' and OHOSTS = 'C' Then 7
        When @Shipped = 'S' and OHOSTS = 'O' Then 6
        When @Cash = 'N' and @TagsVerified like '%Y%' and @TagCount = (select a.TagsLoaded from sales.IBM.OrdersShipping a where a.OrderID = @OrderID)
            Then 4

        When @Cash = 'Y' and  @Payment > '0' and @TagsVerified like '%Y%' and @TagCount = (select a.TagsLoaded from sales.IBM.OrdersShipping a where a.OrderID = '35632')
            Then 4  

        When @LoadedUnits > '0' and @LoadedWeight > '0' 
            Then 3 

        When @VehicleType = 'VAN' and exists(select * from [IBM].[S10F8DCP].SALFIL.TRINSP where Y7ONO = @OrderID)
            Then 2 

        When @LoadDate > '0' and @VehicleType <> 'VAN'
            Then 2

        When @LoadDate > '0' and @VehicleType = 'VAN' 
            Then 1
        Else 5

    End)

FROM sales.IBM.OrdersShipping a
join [IBM].[S10F8DCP].SALFIL.SORDHAD b  on b.Y6ONO = a.OrderId
join [IBM].[S10F8DCP].SALFIL.SORDH c on c.OHONO = b.Y6ONO
join [IBM].[S10F8DCP].SALFIL.TAGCUR d on d.TGORDER = c.OHONO

Update sales.ibm.ordersshipping 
set sales.ibm.ordersshipping.ShippingStatus = 
    (Case 
        When @ShipStatus = 1 Then 'READYINSP'
        When @ShipStatus = 2 Then 'READYLOAD'
        When @ShipStatus = 3 Then 'READYSCAN'
        When @ShipStatus = 4 Then 'READYSHIP'
        When @ShipStatus = 5 Then 'NOTARRIVED'
        When @ShipStatus = 6 Then 'SHIPPED'
        When @ShipStatus = 7 Then 'COMPLETE'
    END)
where OrderID = @OrderID
END
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多