Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用declare和set变量创建存储过程_Sql Server_Sql Server Ce - Fatal编程技术网

Sql server 使用declare和set变量创建存储过程

Sql server 使用declare和set变量创建存储过程,sql-server,sql-server-ce,Sql Server,Sql Server Ce,我正在创建一个存储过程,其中只需传递值,并且必须从多个表中检索多个值。我试着这样做,但它显示错误如下 靠近开始的语法不正确 及 必须声明标量变量@OrderID 我想你想把订单ID传进来。因此: CREATE PROCEDURE [dbo].[Procedure_Name] ( @OrderID INT ) AS BEGIN Declare @OrderItemID AS INT DECLARE @AppointmentID AS INT DECLARE @Pur

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

靠近开始的语法不正确

必须声明标量变量@OrderID


我想你想把订单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

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

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

哪里声明了
@OrderID
?请发布整个过程,您发布的代码中没有
BEGIN
。还有,为什么你给变量赋值,却从不在任何地方使用结果?这些应该是输出参数吗?因为我假设一个订单可能有许多订单项、约会或采购订单,您能描述一下要分配给变量的参数吗?按照@Martin的建议发布所有代码,以及发布您的实际目标、一些示例数据和期望的结果,也可能会有所帮助。我不知道,我想这是个人偏好,但使用
SET
更清楚,尤其是对于单个值。否则,它将隐藏在整个
SELECT
语句中。另一方面,您的结果是未定义的,因为您使用了
TOP
,而没有
ORDER BY
——它将拾取任意行。我更愿意省略
顶部
——这样,如果您的意思是内部查询只选择一行,否则会出现错误。使用
SELECT@OrderItemID=
top1
方法,可以静默地获取任意行。对于
OrderID
是主键的情况,这是一回事,但在其他情况下,我认为我们需要更好地定义实际需要哪个AppointmentID/PurchaseOrderID。老大?最近的?价值最高的那个?
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