使用DECLARE和SET变量创建存储过程

18

我正在创建一个存储过程,仅需要传递一个值,并且我必须从多个表中检索多个值。 我尝试像这样做,但它显示错误:

Begin 附近的语法不正确。

必须声明标量变量 @OrderID。

Declare @OrderItemID AS INT
DECLARE @AppointmentID AS INT
DECLARE @PurchaseOrderID AS INT
DECLARE @PurchaseOrderItemID AS INT
DECLARE @SalesOrderID AS INT
DECLARE @SalesOrderItemID AS INT

SET @OrderItemID = (SELECT OrderItemID FROM [OrderItem] WHERE OrderID = @OrderID)

SET @AppointmentID = (SELECT  AppoinmentID FROM [Appointment] WHERE OrderID = @OrderID)

SET @PurchaseOrderID = (SELECT  PurchaseOrderID FROM [PurchaseOrder] WHERE OrderID = @OrderID)

4
@OrderID 是在哪里声明的?请发布整个过程,您发布的代码中没有 BEGIN。另外,为什么要对变量进行赋值,然后从未在任何地方使用结果?这些应该是输出参数吗? " @OrderID " 在哪里声明?请贴出完整的存储过程。你发布的代码中没有 " BEGIN " 。另外,你为什么要给变量赋值,然后却从来没有在任何地方使用结果?这些变量应该是输出参数吗? - Martin Smith
1
由于我假设一个订单可能有许多订单项、预约或采购订单,您能描述一下您想要分配给变量的是哪一个吗?像@Martin建议的那样发布所有代码可能会有所帮助,同时发布您的实际目标、一些示例数据和期望的结果也可能会有所帮助。 - Aaron Bertrand
2个回答

19

你应该尝试这个语法-假设你想要将@OrderID作为你的存储过程的参数:

你可以尝试这种语法-假设你想让@OrderID成为存储过程的参数:

CREATE PROCEDURE dbo.YourStoredProcNameHere
   @OrderID INT
AS
BEGIN
 DECLARE @OrderItemID AS INT
 DECLARE @AppointmentID AS INT
 DECLARE @PurchaseOrderID AS INT
 DECLARE @PurchaseOrderItemID AS INT
 DECLARE @SalesOrderID AS INT
 DECLARE @SalesOrderItemID AS INT

 SELECT @OrderItemID = OrderItemID 
 FROM [OrderItem] 
 WHERE OrderID = @OrderID

 SELECT @AppointmentID = AppoinmentID 
 FROM [Appointment] 
 WHERE OrderID = @OrderID

 SELECT @PurchaseOrderID = PurchaseOrderID 
 FROM [PurchaseOrder] 
 WHERE OrderID = @OrderID

END

当然,这只适用于返回一个值的情况(而不是多个值!)


10

我假设您想要传递订单ID。那么:

CREATE PROCEDURE [dbo].[Procedure_Name]
(
    @OrderID INT
) AS
BEGIN
    Declare @OrderItemID AS INT
    DECLARE @AppointmentID AS INT
    DECLARE @PurchaseOrderID AS INT
    DECLARE @PurchaseOrderItemID AS INT
    DECLARE @SalesOrderID AS INT
    DECLARE @SalesOrderItemID AS INT

    SET @OrderItemID = (SELECT OrderItemID FROM [OrderItem] WHERE OrderID = @OrderID)
    SET @AppointmentID = (SELECT AppoinmentID FROM [Appointment] WHERE OrderID = @OrderID)
    SET @PurchaseOrderID = (SELECT PurchaseOrderID FROM [PurchaseOrder] WHERE OrderID = @OrderID)
END

我不知道,我猜这是个人偏好,但使用SET更清晰地了解正在发生的事情,特别是对于单个值。否则,它会在整个SELECT语句中被隐藏。 - twilson
1
另一方面,由于您在没有使用ORDER BY的情况下使用了 TOP,所以结果未定义 - 它将选择任意一行。我更喜欢省略 TOP - 这样,如果您想让内部查询仅选择一行,则会收到错误提示。而采用 SELECT @OrderItemID =TOP 1 方法,则会无声地获取任意一行。对于OrderID是主键的情况,这是一件好事,但在其他情况下,我认为我们需要更好地定义哪个AppointmentID / PurchaseOrderID实际上是所需的。最老?最新的?具有最高值的? - Aaron Bertrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接