Sql server 使用declare和set变量创建存储过程
我正在创建一个存储过程,其中只需传递值,并且必须从多个表中检索多个值。我试着这样做,但它显示错误如下 靠近开始的语法不正确 及 必须声明标量变量@OrderIDSql 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
我想你想把订单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