2012-01-05 16 views
16

Tengo un script simple actualizando y mostrando un useraccount. (trabajando con el estudio de gestión 2010) Para evitar errores de usuario, quiero usar una variable en SQL (nunca antes lo hizo).No lo entiendo mensaje de error: debe declarar la variable escalar "@Username".

Al leer tutoriales debe ser tan simple como codesample a continuación, excepto que recibo un mensaje de error. Al buscar personas con el mismo error en la Web, termino viendo código muy complejo con el mismo error. ¿Puede alguien darme una pista?

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 

Msg 137, nivel 15, estado 2, línea 3 debe declarar la variable escalar "@ nombre de usuario".

+0

Puede haber un problema de sensibilidad entre mayúsculas y minúsculas ... Revise su script sql .. – VS1

Respuesta

52

El alcance de la variable en Transact-SQL está limitado por lotes. el script contiene dos lotes separados por "Go"

+4

+1 por la única respuesta que menciona "lote" – gbn

+0

+1 por ser claro "Su secuencia de comandos contiene dos lotes separados por" IR "' –

6

Hay un GO dentro de la secuencia de comandos, GO divide la secuencia de comandos en dos lotes, por lo que debe volver a definir todas las variables utilizadas después de GO, porque el alcance está limitado a este lote.

BTW: No creo, que este GO es necesario, ¿no?

Gracias a @gbn y @alexm dando pista, que GO declaraciones separadas en lotes y no en las transacciones, consulta http://msdn.microsoft.com/en-us/library/ms188037.aspx

+2

¿Qué quiere decir escribir * transacciones *? AFAIK 'GO' no tiene nada en común con las transacciones (en estricto significado de base de datos). –

+0

Lo que digo, soy bastante nuevo en SQL. ¿Cuándo necesito la declaración GO? –

+0

@LuukKrijnen: http://stackoverflow.com/q/971177/27535 por ejemplo. Además, la respuesta de alexm es la correcta. – gbn

0

Una vez que escribir GO, @UserName no está disponible para consulta de selección.

0

que tienen que redefinir @Username después GO comunicado

1

GO separa lotes y es un cliente instrucción , no un servidor uno. Entonces el servidor recibe el segundo lote por separado como una nueva consulta y en esto la variable no se declara.

Si intenta hacer lo siguiente obtendrá un error, ya que el servidor no entiende el comando GO:

DECLARE @SQL varchar(1000); 
SET @SQL = 'PRINT ''hello''; 
GO 
PRINT ''goodbye'';'; 

El servidor no dividirla en dos lotes, lotes, porque son cosas presentados al servidor por el cliente.

Cuestiones relacionadas