2012-01-31 2 views
1

저장 프로 시저의 매개 변수 스니핑과 해결 방법에 대한 기사 (특히 여기에서)를 많이 읽었습니다. 예를 들면 다음과 같습니다. http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/매개 변수 스니핑 및 중첩 저장 프로 시저

다른 저장 프로 시저에서 호출하는 저장 프로 시저에도 동일하게 적용됩니까? 즉, 링크 된 기사에서 설명 된 솔루션은 중첩 저장 프로 시저에도 적용됩니다.

또한 호출 저장 프로 시저에서 @PersonID라는 변수를 선언하는 경우 호출 된 저장 프로 시저에서 @PersonID라는 변수를 decalre 할 수 있습니까? 예 : DECLARE PersonID int. 이것은 가변적 인 섀도 잉입니다.

답변

2

첫 번째 예. 각 저장 프로 시저가 분리되어 있으므로 각 저장 프로 시저에 안티 스니핑 기술 (매개 변수 마스킹 또는 최신 OPTIMISE FOR UNKNOWN)을 적용해야합니다.

두 번째로 예 (그렇지만 이유는 아님)가 예입니다. 변수는 해당 저장 프로 시저에 범위 만 있습니다. 따라서 피 호출자의 @PersonID는 호출자의 @PersonID와 관련이 없습니다. 피 호출자에 @PersonID가 없으면 부모님이 범위에 없습니다.

+0

감사합니다. 따라서 저장 프로 시저 1에서 PersonID = 1 및 저장 프로 시저 2에서 PersonID = 2를 선언하면 저장 프로 시저 2에서 저장 프로 시저 1로 제어가 다시 전달 된 후 PersonID가 1과 같음을 확인할 수 있습니까? 동일한 변수를 사용하는 위험이 있습니까? 이름? – w0051977

+0

예, PersonID = 1은 proc 1에 남아 있습니다. proc 2의 내부는 효과가 없습니다. NET 또는 Java 메소드와 "캡슐화"를 생각해보십시오. 이해가된다면 위험하지 않습니다. 중첩 된 proc은 그 자체의 메소드이므로 별도로 호출 할 수도 있습니다 – gbn

+0

고마워요. 이 질문에 답을 표시 할 준비가 거의 다되었습니다. 명시 적 트랜잭션과 함께 'XACT_ABORT ON'을 사용하여 저장 프로 시저에 오류가있을 때 트랜잭션이 롤백되도록합니다. 따라서 VB6 명령 개체 (이 저장 프로 시저를 호출하는)에 시간 초과가 있거나 저장 프로 시저가 예외를 throw하면; 프로그램은 그것을 처리 할 것이다. 나는 최근에 'XACT_ABORT ON'을 발견했습니다. VB6 프로그램에서 저장 프로 시저를 호출 할 때 고려해야 할 사항이 있습니까? – w0051977

관련 문제