8

Tôi có báo cáo kết quả sau đây trong một Stored Procedure:Làm thế nào để sử dụng một giá trị từ một thủ tục lưu sẵn trong một thủ tục khác?

DECLARE @Count INT 
EXEC @Count = GetItemCount 123 
SELECT @Count 

nào gọi một thủ tục lưu trữ với các tuyên bố sau bên trong:

SELECT COUNT(Item) FROM tblItem WHERE ID = @ID 

Tuy nhiên khi tôi thử nghiệm các cuộc gọi EXEC kết quả đầu ra giá trị chính xác nhưng nó không được gán cho Biến số @Count chính xác. Tôi đã xem các ví dụ hoặc các thủ tục được lưu trữ được sử dụng như thế này, bao gồm ở đây nhưng không có tham số nào và giá trị trả về được sử dụng (mà tôi có thể tìm thấy). Tham số ID được chuyển vào câu lệnh thứ hai trả về giá trị đếm được sử dụng bởi StoredProcedure đầu tiên - tất cả thông tin tôi đã đọc dường như cho biết điều này sẽ hoạt động - nhưng giá trị @Count không phải là số 0, ngay cả khi GetItemCount trả về luôn giá trị chính xác.

Đây là trong Microsoft SQL Server 2008 nếu có ích.

+0

tôi đã có thể có được điều này để làm việc - có một đầu ra như một tham số được giải pháp - tiếp tục lãng quên SQL không giống như kiểu lập trình mà tôi từng sử dụng. – RoguePlanetoid

Trả lời

22

Trong thủ tục lưu trữ của bạn, bạn có một trong hai

a) Gán giá trị của số lượng đến một tham số đầu ra:

CREATE PROCEDURE GetItemCount 
    @id INT, 
    @count INT OUTPUT 
AS 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

gọi là:

DECLARE @count INT 
EXEC GetItemCount 123, @count OUTPUT 

hoặc, b) Gán giá trị đếm làm giá trị trả lại:

CREATE PROCEDURE GetItemCount 
    @id INT 
AS 
BEGIN 
    DECLARE @count INT 
    SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id 

    RETURN @count 
END 

gọi là:

DECLARE @count INT 
EXEC @count = GetItemCount 123 
+0

Cảm ơn vì điều này - nó đã hoạt động - không nghĩ rằng đầu ra sẽ là tham số - đó là lý do tại sao tôi không thể hình dung ra được đầu ra màn hình là đầu ra khi thực tế không có gì được trả về. Tôi đọc giá trị. – RoguePlanetoid

+0

Đã tìm kiếm vấn đề này một vài lần kể từ khi tôi hỏi câu hỏi này và quay lại đây và tìm thấy giải pháp, mong muốn có thể bình chọn mỗi khi nó giúp tôi! – RoguePlanetoid

2

Bạn nên vượt qua @Count như một tham số đầu ra.

Create Proc dbo.usp_Proc1 

@Id int, 
@Count int output 

as begin 

select @Count = Count(Item) from tblItem where [email protected] 

end 
Go 

Declare @Count int 
Declare @Id int 

Set @Id = 1 

Exec dbo.usp_Proc1 @Id, @Count output 

select @Count 
+0

Ví dụ này cũng hữu ích, để nhận được truy vấn của tôi hoạt động chính xác nên cảm ơn một lần nữa. – RoguePlanetoid

0

Điều bạn đang nắm bắt trong biến @Count là trạng thái thực hiện thủ tục lưu trữ GetItemCount và không phải là giá trị như bạn mong đợi. Để nắm bắt được giá trị đó, bạn có hai cách.

  1. Để khai báo một tham số khác @count là OUTPUT trong GetItemCount. Vì vậy, bạn sẽ phải khai GetItemCount như sau

    CREATE PROCEDURE GetItemCount @ID int, int @count đầu ra

bên trong, bạn có thể sử dụng

CHỌN @count = COUNT (Item) TỪ ĐÂU tblItem ID = @ID

  1. Để khai báo bảng trước khi gọi cho proc và nhận giá trị đó dưới dạng cột.
1

Một cách khác

DECLARE @Count table(counting INT) 
Insert into @Count 
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
1

Giải pháp (b) do ông Matthew sẽ không hoạt động khi u gọi này trong một thủ tục lưu trữ khác (giải pháp Ofcourse (a) hoạt động hoàn hảo khi chúng tôi sử dụng OUTPUT param). Giải pháp thay thế cho giải pháp (b) là giải pháp của Mr.Madhivanan. tức là, tạo một bảng tạm thời và sử dụng nó rồi thả nó.

Dưới đây là các giải pháp khác ..

Chúng tôi không thể nhận giá trị từ mệnh đề OUTPUT nội bộ trong quy trình được lưu trữ trực tiếp. Vì vậy, chúng tôi phải sử dụng tham số OUTPUT hoặc RETURN VALUE để thay thế.

Vui lòng tham khảo những gợi ý sau đây:

GIẢI PHÁP 1:

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) 
AS 


BEGIN 
DECLARE @MyTableVar Table(ProductID 
int) 


     INSERT Products 
     ( 
      pName 
    ) 
     OUTPUT Inserted.ProductID 
INTO @MyTableVar 
     VALUES 
     ( 
     @pName 
    ) 
RETURN (SELECT ProductID 
FROM @MyTableVar) 
END 


DECLARE @ProductID int 
EXEC @ProductID = [dbo].insertproduc 'TEST' 
SELECT @ProductID 

SOLUTION: 2

CREATE PROCEDURE [dbo].[InsertProduct] 
     @pName varchar(50) , @pID int output 
AS 

BEGIN 
DECLARE @MyTableVar Table(ProductID int) 

     INSERT Products 
     (
      pName 
    ) 
     OUTPUT Inserted.ProductID INTO @MyTableVar 
     VALUES 
     (
     @pName 
    ) 
SELECT @pID=ProductID FROM @MyTableVar 
END 

DECLARE @ProductID int 
EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT 
SELECT @ProductID 
0

Sau đây sẽ không hoạt động nếu không có thông số đầu vào cho SP được thực thi:

EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT --works 
EXEC [dbo].insertproduc, @ProductID OUTPUT -- generates a parameter supplied when not needed error message if the insertproduc does not require parameters. 

tốt nhất để sử dụng định dạng sau cho tất cả các trường hợp (nó hoạt động trên tất cả các phiên bản):

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable = [dbo].MyStoredProc