2010-06-23 4 views
1

실제 열에서 bigint 변수를 검색하기 위해 열 이름을 전달하고 사용하려면 어떻게해야합니까?저장 프로 시저에서 매개 변수로 열을 전달하는 방법은 무엇입니까?

DECLARE @personID BIGINT, 
DECLARE @queryString varchar(500) 

Set @queryString = 'Select @personID = ' + @PersonColumnID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 
exec(@queryString) 

"변수 '@personID'을 (를) 선언해야합니다."라는 오류 메시지가 표시됩니다. 나는 또한 시도했다

Set @queryString = 'Select ' + @personID + ' = ' + @witnessPersonID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 

그리고 "오류가 발생했습니다.

의견이 있으십니까?

DECLARE @SQL NVARCHAR(max) 
    SET @SQL = 'SELECT @personID = w.' + @PersonColumnID + ' 
        FROM dbo.Loss_Witness w 
       WHERE w.witnessID = @witnessID ' 

BEGIN 

    EXEC sp_executesql @SQL, @personID = @personID OUTPUT, @witnessID 

END 

another example here있다 :

답변

6

당신은 @personID가 OUTPUT 키워드 out 매개 변수로 지정해야합니다.

1

또한 코드에 SQL 주입 보안 구멍이있을 수 있습니다. @PersonColumnID를 살균하지 않으면 커다란 문제가 발생할 수 있습니다.

+0

@OMG 포니 스 (Ponies) 약간의 경우에도 열 이름을 sp_executesql의 매개 변수로 전달할 수 없으므로 입력의 연결 이유 (값이 매개 변수임을 유의하십시오)가 여전히 위험합니다. –

+0

나는이 주석을 이해하기 위해 고심하고있다. 당신이 인용 한 논문은 훌륭하고 동적 SQL에 대한 표준 읽기입니다. 하지만 상관없이 @PersonColumnID가 삭제되지 않는 한 주어진 코드와 다시 작성시 거대한 SQL 삽입 지점이 있습니다. 질문자가이 사실을 알지 못했을 수도 있습니다. – Yellowfog

+0

SELECT @PersonColumnID = '1; 드롭 데이터베이스를 blah - '; – Yellowfog

관련 문제