2009-03-03 50 views
10

Tôi nghĩ rằng tôi có cùng một vấn đề như kcrumley mô tả trong câu hỏi "Problem calling stored procedure from another stored procedure via classic ASP". Tuy nhiên câu hỏi của anh không thực sự bao gồm một giải pháp, vì vậy tôi sẽ cung cấp cho nó một shot, thêm những quan sát của riêng tôi:MS SQL: Loại bỏ giá trị trả về của thủ tục lưu sẵn được gọi trong thủ tục lưu sẵn

Tôi có hai thủ tục lưu trữ:

CREATE PROCEDURE return_1 AS BEGIN 
    SET NOCOUNT ON; 
    SELECT 1 
END 

CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN 
    SET NOCOUNT ON; 
    EXEC return_1 
    SELECT 2 
END 

Lưu ý rằng cả hai thủ tục chứa "SET NOCOUNT ON ". Khi tôi thực hiện "call_return_1_and_return_2" Tôi vẫn nhận được hai bộ bản ghi. Đầu tiên giá trị 1, sau đó là giá trị 2.

Điều đó ném ASP (cổ điển VBScript ASP) ra khỏi tuyến đường.

Bất kỳ gợi ý nào về cách tôi có thể chặn tập kết quả đầu tiên? Tại sao nó có ngay cả với NOCOUNT?

Bỏ qua bộ bản ghi đầu tiên trong ASP không phải là một tùy chọn. Tôi cần một giải pháp "cơ sở dữ liệu duy nhất".

+0

Một vài câu trả lời chỉ ra rằng bạn có thể thay đổi từ SELECT thành RETURN, nhưng điều gì sẽ xảy ra nếu proc được lưu trữ phải chọn, và bạn không thể thay đổi nó? Tôi tự hỏi nếu nó có thể "nuốt" một kết quả thiết lập như thế. –

Trả lời

8

Không phải NOCOUNT đó gây ra điều này, các thủ tục được lưu trữ của bạn có một lựa chọn để mỗi người sẽ đến trong tập kết quả của chính nó. Điều này có thể tránh được bằng cách thay đổi thủ tục lưu trữ đầu tiên của bạn để sử dụng các tham số đầu ra để vượt qua số 1 trở lại thay vì thực hiện một lựa chọn. Các thủ tục lưu trữ thứ hai sau đó có thể kiểm tra các tham số đầu ra để có được dữ liệu cần thiết để chạy.

Hãy thử một cái gì đó như thế này

CREATE PROCEDURE Proc1 
(
    @RetVal INT OUTPUT 
) 
AS 
SET NOCOUNT ON 
SET @RetVal = 1 


CREATE PROCEDURE Proc2 
AS 
SET NOCOUNT ON 
DECLARE @RetVal int 
EXEC [dbo].[Proc1] 
     @RetVal = @RetVal OUTPUT 
SELECT @RetVal as N'@RetVal' 
2

Những không trở biến, nhưng bộ hồ sơ đầu ra. Tôi đoán rằng ngay sau khi máy chủ SQL tuôn ra đầu ra cho khách hàng, bạn đang hơi say và không thể lấy lại nó.

Tôi sẽ giải quyết điều này bằng cách thêm tham số vào SP trả về_1, điều đó sẽ kiểm soát nếu return_1 sẽ chọn bản ghi hoặc chỉ thực hiện công việc và thoát âm thầm.

12

Như Matt chỉ ra trong bình luận của mình, không phải giải pháp nào thực sự 'nuốt' kết quả đầu tiên. Tôi không biết tại sao bạn muốn điều này nhưng bạn có thể 'nuốt' kết quả của việc thực hiện đầu tiên bằng cách sử dụng một biến bảng. Nó phải khớp với số lượng chính xác và loại cột của tập hợp kết quả. Giống như vậy:

CREATE PROCEDURE return_1 AS 
    SET NOCOUNT ON; 
    SELECT 1 
GO 
CREATE PROCEDURE call_return_1_and_return_2 AS 
    SET NOCOUNT ON; 
    DECLARE @Result TABLE (res int) 
    insert into @Result EXEC return_1 
    SELECT 2 
GO 
Các vấn đề liên quan