2012-01-05 3 views
16

나는 간단한 스크립트를 업데이트하고 useraccount를 보여줍니다. (관리 스튜디오 2010 작업) 사용자 오류를 방지하기 위해 SQL에서 변수를 사용하고 싶습니다.오류 메시지를 이해할 수 없음 : "@ 사용자 이름"스칼라 변수를 선언해야합니다.

자습서를 읽을 때 오류 메시지가 나타나는 것을 제외하고는 코드 샘플처럼 간단해야합니다. 웹에서 동일한 오류가있는 사용자를 검색하면 동일한 오류가있는 매우 복잡한 코드가 표시됩니다. 누군가가 내게 단서를 줄 수 있습니까?

DECLARE @Username nvarchar(256) 
Set @Username = 'theUsername' 

UPDATE aspnet_Membership 
SET IsLockedOut = 0 
WHERE UserId IN (SELECT U.UserId 
FROM aspnet_Users as U inner join aspnet_Membership M on U.UserId = M.UserId 
WHERE u.UserName = @Username) 
GO 
SELECT U.UserId, U.UserName, M.Password, M.IsLockedOut, U.LastActivityDate 
FROM aspnet_Users as U inner join aspnet_Membership M on U.UserId = M.UserId 
WHERE u.UserName = @Username 

메시지 137, 수준 15, 상태 2, 줄 3 은 스칼라 변수 "@username"를 선언해야합니다.

+0

변수 명명에 대소 문자가 구별 될 수 있습니다 ... SQL 스크립트를 다시 확인하십시오 .. – VS1

답변

52

거래-SQL에서 변수의 범위는 배치에 의해 제한됩니다 @UsernameGO 후 다시 정의해야합니다. 스크립트가

+4

"일괄 처리"라고하는 유일한 대답은 +1 – gbn

+0

+1 '귀하의 스크립트에는'GO '로 구분 된 두 개의 배치가 포함되어 있습니다. –

6

스크립트 내에 GO이 있습니다. GO은 스크립트를 두 개의 배치로 나눕니다. GO 이후의 모든 사용 변수를 다시 정의해야합니다. 범위가이 배치에 한정되어 있기 때문입니다.

현재 :이 GO이 필요하지 않다고 생각하지 않습니까? 일괄로하지 거래에 GO 계산서, 당신은 GO를 작성하면, @username 쿼리를 선택하기 위해 사용할 수 없습니다 또한 http://msdn.microsoft.com/en-us/library/ms188037.aspx

+2

* transactions *를 쓰는 것은 무엇을 의미합니까? AFAIK'GO'는 트랜잭션 (데이터베이스 의미에서)과 공통점이 없습니다. –

+0

내가 말하는 것은 SQL보다 약간 새로운 것입니다. 언제 GO 선언문이 필요합니까? –

+0

@LuukKrijnen : http://stackoverflow.com/q/971177/27535 예를 들면. 또한, 알렉 스의 대답은 올바른 것입니다. – gbn

0

을 볼 것을,

덕분에 @gbn하고 @alexm는 힌트를 제공합니다.

1

GO는 배치를 분리하고 클라이언트 명령이 아닌 서버 하나입니다 "GO"에 의해 분리 된 두 개의 배치가 포함되어 있습니다. 따라서 서버는 새 쿼리로 두 번째 일괄 처리를 별도로받습니다.이 경우 변수는 선언되지 않습니다.

당신은 서버가 명령 GO을 이해하지 않기 때문에, 당신이 오류가 발생합니다 다음 작업을 수행하려고하면 :

DECLARE @SQL varchar(1000); 
SET @SQL = 'PRINT ''hello''; 
GO 
PRINT ''goodbye'';'; 
일괄 제출 것들이기 때문에

서버는 두 개의 일괄 처리로이 분할되지 않습니다 클라이언트에 의해 서버에 전송됩니다.

관련 문제