【问题标题】:Creating stored procedure with declare and set variables使用声明和设置变量创建存储过程
【发布时间】:2012-03-03 15:52:03
【问题描述】:

我正在创建一个存储过程,其中只有值必须通过,并且我必须从多个表中检索多个值。我试图这样做,但它显示错误,如

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)

【问题讨论】:

  • @OrderID 在哪里声明?请发布整个过程,您发布的代码中没有BEGIN。另外,为什么要分配给变量然后从不在任何地方使用结果?这些应该是输出参数吗?
  • 由于我假设一个订单可能有许多订单项目、约会或采购订单,您能描述一下您想将哪个分配给变量吗?按照@Martin 的建议发布所有代码以及发布您的实际目标、一些示例数据和期望的结果也可能会有所帮助。

标签: sql-server sql-server-ce


【解决方案1】:

您应该尝试这种语法 - 假设您希望将 @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

当然,这仅在您只返回一个值(而不是多个值!)时才有效

【讨论】:

    【解决方案2】:

    我假设您想传递订单 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 语句中。
    • 另一方面,您的结果是未定义的,因为您使用了 TOP 而没有 ORDER BY - 它会选择任意行。我宁愿省略TOP - 这样,如果您的意思是内部查询只选择一行,否则您会收到错误消息。使用SELECT @OrderItemID = TOP 1 方法,您可以静默获取任意行。对于OrderID 是主键的情况,这是一回事,但在其他情况下,我认为我们需要更好地定义实际需要哪个 AppointmentID / PurchaseOrderID。最老的?最近的?价值最高的那个?
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2016-04-17
    相关资源
    最近更新 更多