2012-02-11 10 views
11

Sto creando una stored procedure in cui deve passare solo il valore e devo recuperare più valori da più tabelle. Ho cercato di fare in questo modo, ma i suoi errori come mostranoCreazione stored procedure con dichiarazione e impostazione delle variabili

sintassi non corretta in prossimità Begin

e

Deve dichiarare la variabile scalare @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

Dove è dichiarato '@ OrderID'? Si prega di inviare l'intera procedura, non c'è 'INIZIO' nel codice che hai postato. Inoltre, perché stai assegnando alle variabili, quindi non utilizzi mai i risultati da nessuna parte? Dovrebbero essere questi parametri di output? –

+1

Dato che presumo che ci possano essere molti articoli di ordine, appuntamenti o ordini di acquisto per un ordine, puoi descrivere quale si desidera assegnare alla variabile? Potrebbe anche aiutare a postare tutto il codice suggerito da @Martin e anche a pubblicare i tuoi obiettivi reali, alcuni dati di esempio e i risultati desiderati. –

risposta

3

Presumo che tu voglia passare l'ID ordine. Quindi:

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

Non so, credo che sia una preferenza personale, ma è più chiaro cosa sta succedendo usando 'SET', specialmente per un singolo valore. Altrimenti viene nascosto nell'intera istruzione 'SELECT'. – twilson

+1

D'altra parte, il tuo risultato non è definito perché hai usato 'TOP' senza' ORDER BY' - sceglierà una riga arbitraria. Preferirei lasciare il 'TOP' - in questo modo se intendevi la query interna per selezionare solo una riga, altrimenti otterrai un errore. Con gli approcci 'SELECT @OrderItemID =' o 'TOP 1', si ottiene in modo silenzioso la riga arbitraria. Per i casi in cui 'OrderID' è la chiave primaria è una cosa, ma in altri casi penso che abbiamo bisogno di una definizione migliore di quale AppointmentID/PurchaseOrderID sia effettivamente desiderato. Il più vecchio? Il più recente? Quello con il valore più alto? –

+0

Commento equo su TOP – twilson

15

Si dovrebbe provare questa sintassi - supponendo che si desidera avere @OrderID come parametroper la stored procedure:

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 

Naturalmente, che funziona solo se si sta tornando esattamente un valore (non più valori!)

Problemi correlati