2010-06-14 73 views
30

Tôi có một thủ tục được lưu trữ, kết thúc bằng lệnh SELECT, trả về một bản ghi. Tôi có thể gọi nó trong quy trình lưu trữ anoher như sau:TSQL: Gọi thủ tục lưu sẵn từ một thủ tục lưu sẵn khác và đọc kết quả

EXEC procedure @param 

Làm cách nào để nhận bản ghi trả lại? Cảm ơn

+2

Có vẻ như quy trình lưu trữ của bạn thực sự là một chế độ xem: http://msdn.microsoft.com/en-us/library/aa258253%28SQL.80%29.aspx –

+2

Tại sao bạn đưa ra tuyên bố này? Ai biết được những gì đang xảy ra trong proc được lưu trữ trong các hình thức cập nhật vv ... –

Trả lời

2

AFAIK, bạn không thể. Những gì bạn có thể muốn làm là sử dụng một hàm cho các thủ tục đầu tiên (hoặc cả hai) của bạn. Các hàm chỉ có thể trả về một thứ, nhưng chúng có thể trả về một bảng. Các thủ tục được lưu trữ có thể trả lại nhiều kết quả, nhưng không trả lại các chức năng khác/các thủ tục lưu sẵn.

ví dụ .:

CREATE FUNCTION [dbo].[fn_GetSubordinates] (
    @sPersonID VARCHAR(10), 
    @nLevels INT 
) 
RETURNS @tblSubordinates TABLE 
(
    Person_Id VARCHAR(10), 
    Surname char(25), 
    Firstname char(25) 
) 
AS 
BEGIN 
    ... 
29

Bạn có thể tạo một bảng tạm thời và sau đó sử dụng INSERT INTO #MyTable EXEC procedure @param.

Có một số khác techniques listed here.

1

Bạn có thể làm điều này với một biến đầu ra trong proc lưu trữ. Ví dụ:

CREATE PROCEDURE sp_HelloWorld @MyReturnValue int OUT 
AS 
SELECT @MyReturnValue = 100 
Return @MyReturnValue 

Để gọi proc lưu trữ này, làm như sau:

DECLARE @TestReturnVal int 

EXEC sp_HelloWorld @TestReturnVal output 
SELECT @TestReturnVal 
0

Trước tiên, bạn KHÔNG THỂ RETURN một recordset bởi thủ tục lưu trữ. Đổi lại, một thủ tục được lưu trữ chỉ có thể trả về các số nguyên.

Bạn đã đề cập đến tuyên bố SELECT, là DQL và chỉ dành cho mục đích hiển thị.

Cách bạn có thể thực hiện để khắc phục sự cố này là bạn có thể gán bản ghi cho bảng tạm thời toàn cục cũng có thể được truy cập trong thủ tục được lưu trữ bên ngoài.

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