2012-02-11 2 views
11

Я создаю одну хранимую процедуру, в которой нужно передать только значение, и мне нужно получить несколько значений из нескольких таблиц. Я пытался сделать так, но его показ ошибок какСоздание хранимой процедуры с объявлением и заданными переменными

Неправильный синтаксис около 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) 
+4

Где объявляется '@ OrderID'? Пожалуйста, опубликуйте всю процедуру, в коде, который вы опубликовали, нет 'BEGIN'. Также почему вы назначаете переменные, а затем никогда не используете результаты? Должны ли они быть выходными параметрами? –

+1

Поскольку я предполагаю, что может быть много заказов, заказов или заказов на поставку для заказа, можете ли вы описать, какой из них вы хотите назначить переменной? Это также может помочь опубликовать весь код, предложенный @Martin, а также опубликовать ваши фактические цели, некоторые примеры данных и желаемые результаты. –

ответ

3

Я предполагаю, что вы хотите передать идентификатор заказа. Итак:

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

Я не знаю, я думаю, это личное предпочтение, но яснее, что происходит, используя 'SET', особенно для одного значения. В противном случае он скрывается во всей инструкции SELECT. – twilson

+1

С другой стороны, ваш результат не определен, потому что вы использовали 'TOP' без' ORDER BY' - он выберет произвольную строку. Я бы предпочел оставить «TOP» - таким образом, если бы вы имели в виду внутренний запрос, чтобы выбрать только одну строку, в противном случае вы получите ошибку. При подходах 'SELECT @OrderItemID =' или 'TOP 1' вы произвольно произвольно произвольно выбираете строку. Для случаев, когда «OrderID» является первичным ключом, это одно, но в других случаях я думаю, нам нужно лучшее определение того, что AppointmentID/PurchaseOrderID действительно желателен. Старейший? Самый последний? Тот, который имеет наибольшее значение? –

+0

Справедливый комментарий о TOP – twilson

15

Вы должны попробовать этот синтаксис - если вы хотите иметь @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 

Конечно, это работает только если вы возвращение в точности одно значение (а не несколько значений!)

Смежные вопросы