2012-02-11 14 views
11

Estoy creando un procedimiento almacenado donde solo debe pasar el valor y tengo que recuperar varios valores de varias tablas. Traté de hacerlo así, pero que muestran sus errores comoCreación de un procedimiento almacenado con declarar y establecer variables

sintaxis incorrecta cerca de Begin

y

Debe declarar la variable escalar @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

¿Dónde se declara '@ OrderID'? Por favor, publique todo el procedimiento, no hay 'BEGIN' en el código que ha publicado. Además, ¿por qué asignas variables y luego nunca utilizas los resultados en ninguna parte? ¿Deben estos ser parámetros de salida? –

+1

Como supongo que puede haber muchos artículos de pedido, citas u órdenes de compra para un pedido, ¿puede describir cuál desea asignar a la variable? También podría ser útil publicar todo el código como lo sugirió @Martin y también publicar sus objetivos reales, algunos datos de muestra y los resultados deseados. –

Respuesta

3

Supongo que quiere pasar la ID de pedido. Entonces:

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 
+0

No sé, supongo que es una preferencia personal, pero está más claro lo que está pasando con 'SET ', especialmente para un solo valor. De lo contrario, se oculta en toda la declaración 'SELECT'. – twilson

+1

Por otro lado, su resultado no está definido porque ha utilizado 'TOP' sin' ORDER BY' - elegirá una fila arbitraria. Preferiría omitir el 'TOP' - de esta manera si quieres decir que la consulta interna solo selecciona una fila, de lo contrario obtendrás un error. Con los enfoques 'SELECT @OrderItemID =' o 'TOP 1', obtienes la fila arbitraria en silencio. Para los casos en que 'OrderID' es la clave principal, es una cosa, pero en otros casos creo que necesitamos una mejor definición de qué ID de cita/PurchaseOrderID realmente se desea. ¿El más antiguo? ¿El más reciente? ¿El que tiene el valor más alto? –

+0

Comentario de la feria acerca de TOP – twilson

15

Usted debe tratar esta sintaxis - asumiendo que usted quiere tener @OrderID como parámetropara su procedimiento almacenado:

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 

por supuesto, que sólo funciona si devuelve exactamente un valor (no valores múltiples!)

Cuestiones relacionadas