2009-03-03 3 views
10

"Problem calling stored procedure from another stored procedure via classic ASP"질문에서 kcrumley가 설명한 것과 동일한 문제가 있다고 생각합니다. 두 절차 "NOCOUNT ON SET 포함하는 것이MS SQL : 저장 프로 시저에서 호출 된 저장 프로 시저의 반환 값 숨기기

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 

참고 : 나는 두 개의 저장 프로 시저를

그러나 그의 질문은 정말 솔루션을 포함, 그래서 난 내 자신의 관찰을 추가, 그에게 또 다른 기회를주지 않는다 ". "call_return_1_and_return_2"을 실행할 때 나는 여전히 두 개의 레코드 세트를 얻습니다. 먼저 값 1을 입력 한 다음 값 2를 입력하십시오.

그러면 ASP (클래식 VBScript ASP)가 트랙에서 나옵니다.

첫 번째 결과 집합을 어떻게 억제 할 수 있는지에 대한 힌트가 있습니까? NOCOUNT가있는 이유는 무엇입니까?

ASP에서 첫 번째 레코드 집합 건너 뛰기는 옵션이 아닙니다. "데이터베이스 전용"솔루션이 필요합니다.

+0

응답의 몇 당신이 반환하는 SELECT에서 변경할 수 있음을 지적하고 있지만이 좋은 질문입니다 - 어떤 중첩 된 저장된 프로 시저 뭔가 다른를 호출하기 때문에, SELECT하는 경우, 너는 그것을 바꿀 수 없다? 그런 결과 세트를 삼킬 수 있는지 궁금합니다. –

답변

8

이 문제를 일으키는 NOCOUNT가 아니라 스토어드 프로 시저마다 select가 있으므로 각각의 결과가 자체 결과로 들어갑니다. 첫 번째 저장 프로 시저를 변경하여 출력 매개 변수를 사용하여 선택을 수행하는 대신 숫자 1을 다시 전달하면이 문제를 피할 수 있습니다. 그런 다음 두 번째 저장 프로 시저가 출력 매개 변수를 검사하여 실행해야하는 데이터를 가져올 수 있습니다. 이

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


같은

시도 뭔가 변수 만 출력 레코드 집합을 반환하지 않습니다. 나는 SQL 서버가 고객에게 출력물을 내 보내면 곧 망쳐 버리고 다시 되돌릴 수 없다고 생각합니다.

SP_1에 매개 변수를 추가하여이 문제를 해결할 수 있습니다.이 매개 변수는 return_1이 레코드를 선택하거나 그냥 처리하고 자동으로 종료하면 제어합니다.

12

Matt는 자신의 의견에서 지적했듯이 두 솔루션 모두 첫 번째 결과 집합을 실제로 '삼 키지 않았습니다. 왜 이걸 원 하겠지만 테이블 변수를 사용하여 첫 번째 exec의 결과를 삼킬 수는 있습니다. 결과 집합의 열의 정확한 양과 유형과 일치해야합니다. 그래서 같이 :

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 
관련 문제