2012-02-11 8 views
11

値が渡されなければならない1つのストアドプロシージャを作成していて、複数のテーブルから複数の値を取得する必要があります。私はこのように実行しようとしましたが、 宣言変数とセット変数でストアドプロシージャを作成する

付近に正しくない構文

のようなその示すエラーがスカラー変数が

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

を@OrderID宣言しなければなりません

を開始します注文IDを渡したいと思っています。So:

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'を省略することをお勧めします。内側のクエリが1つの行だけを選択することを意味するならば、そうでなければエラーが発生します。 '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 

を、あなたは1つの値を返すしている場合にのみ動作すること(複数の値ではありません)

関連する問題