2009-10-05 3 views
0

안녕하세요, 어떻게 든 할 수 있습니까? 문을 실행할 때 예외가 발생하면 @Price_Plan이 해제되지 않으므로 임시 쿼리에 @Price_Plan에 액세스 할 수있는 범위가 없습니다. 이 쿼리의 실행마다 이름이 변경되는 테이블을 쿼리하기위한 대안이나 더 좋은 방법이 있습니까?Ad Hoc 쿼리가 로컬 변수에 결과를 할당합니다.

DECLARE @Price_Plan varchar(3), @MNP_Network varchar(3), @GSM_Code varchar(3), @GEO_Dist varchar(6), 
     @Call_ProdNo varchar(7), @Call_Time datetime, @CallId int, @dtl_call_dur int, 
     @Volume varchar(10), @Call_Cost int 

--Assume CallId has a value 

SET @Sql = 
    'SELECT 
     @Price_Plan = Price_Plan, @MNP_Network = MNP_Network, @GSM_Code = GSM_Code, @GEO_Dist = GEO_Dist, 
     @Call_ProdNo = Call_ProdNo, @Call_Time = Call_Time, @dtl_call_dur = dtl_call_dur, 
     @Volume = Volume 
    FROM ' + @TableName + ' 
    WHERE CallId = ' + CONVERT(varchar(10),@CallId) + '' 
    PRINT @SQL 
    EXEC (@Sql) 

답변

3

이 오류가 발생 했습니까? 그 쿼리를 테스트 한 결과 두 가지 오류가 발생했습니다 :

- Not declared @TableName 
- Not declared @Sql 

이러한 변수를 선언 할 때 올바르게 작동해야합니다.

그러나 더 좋은 방법은 sp_executesql을 사용하는 것입니다.

예 :

EXEC sp_executesql 
     N'SELECT * FROM AdventureWorks.HumanResources.Employee 
     WHERE ManagerID = @level', 
     N'@level tinyint', 
     @level = 109; 

먼저 인수 parametes, 두번째 인수 인 쿼리 - 쉼표로 구분 유형 파라미터 이름 다음 파라미터의 실제 값을 진행한다.

편집 : 내 컴퓨터에

DECLARE @retCnt INT 

EXEC sp_executesql 
    N'SELECT @retCnt = COUNT(*) FROM sys.tables', 
    N'@retCnt INT OUTPUT', 
    @retCnt = @retCnt OUTPUT 

SELECT @retCnt 

SELECT 수익 5 :

여기

는 또 다른 예를 사용하여 OUTPUT 매개 변수입니다.

+0

방금 ​​복사 한 더 큰 프로 시저에서 쿼리의 일부를 붙여 넣기 어쨌든, 해결하려고하는 문제는 임시 쿼리에서 반환 값에 @Price_Plan을 할당해야한다는 것입니다. 단일 행 – Neil

+0

OUTPUT 매개 변수를 사용하여 다른 예제를 추가했습니다. 이것을 확인하십시오. 이것은 당신이 필요로하는 것이어야합니다. –

+0

나는 테이블을 매개 변수로 지정할 수 있습니까? 나는 시도했다,하지만 그것은 작동하지 않았다, sproc이 그것을 지원하는지 더 궁금해 할 것이다. – Neil