2012-02-11 22 views
11

Tôi đang tạo một quy trình được lưu trữ trong đó chỉ có giá trị phải vượt qua và tôi phải truy xuất nhiều giá trị từ nhiều bảng. Tôi cố gắng để làm như thế này nhưng lỗi cho thấy nó giống nhưTạo thủ tục lưu sẵn với khai báo và đặt biến

không đúng cú pháp gần Begin

Phải khai báo các biến vô hướng @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' được khai báo ở đâu? Vui lòng đăng toàn bộ quy trình, không có 'BEGIN' trong mã bạn đã đăng. Ngoài ra tại sao bạn chỉ định cho các biến sau đó không bao giờ sử dụng kết quả ở bất kỳ đâu? Đây có nên là thông số đầu ra không? –

+1

Vì tôi cho rằng có thể có nhiều đơn đặt hàng, cuộc hẹn hoặc đơn đặt hàng cho đơn đặt hàng, bạn có thể mô tả đơn hàng bạn muốn chỉ định cho biến không? Nó cũng có thể giúp đăng tất cả mã như @Martin đề xuất và cũng để đăng các mục tiêu thực tế của bạn, một số dữ liệu mẫu và kết quả mong muốn. –

Trả lời

3

Tôi giả sử bạn muốn chuyển ID đơn đặt hàng. Vì vậy:

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

Tôi không biết, tôi đoán đó là sở thích cá nhân, nhưng rõ ràng hơn những gì đang xảy ra bằng cách sử dụng 'SET', đặc biệt là cho một giá trị duy nhất. Nếu không nó sẽ bị ẩn trong toàn bộ câu lệnh 'SELECT'. – twilson

+1

Mặt khác, kết quả của bạn không xác định vì bạn đã sử dụng 'TOP' không có' ORDER BY' - nó sẽ chọn một hàng tùy ý. Tôi muốn loại bỏ 'TOP' - theo cách này nếu bạn muốn truy vấn bên trong chỉ chọn một hàng, bạn sẽ gặp lỗi khác. Với phương thức 'SELECT @OrderItemID =' hoặc 'TOP 1', bạn nhận được hàng tùy ý một cách âm thầm. Đối với các trường hợp 'OrderID' là khóa chính thì đó là một điều, nhưng trong các trường hợp khác, tôi nghĩ rằng chúng ta cần định nghĩa tốt hơn về thứ mà AppointmentID/PurchaseOrderID thực sự mong muốn. Già nhất? Gần đây nhất? Cái có giá trị cao nhất? –

+0

Nhận xét bình luận về TOP – twilson

15

Bạn nên cố gắng cú pháp này - giả sử bạn muốn có @OrderID như một tham số cho thủ tục lưu trữ của bạn:

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 

HÀNH Tất nhiên, đó chỉ có tác dụng nếu bạn đang trở về đúng một giá trị (không phải nhiều giá trị!)

Các vấn đề liên quan