Не понимаю сообщение об ошибке: Должен объявить скалярную переменную "@Username". - программирование
Подтвердить что ты не робот

Не понимаю сообщение об ошибке: Должен объявить скалярную переменную "@Username".

У меня есть простое обновление script и отображение пользовательского счета. (работает с студией менеджмента 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

Msg 137, уровень 15, состояние 2, строка 3 Должен объявить скалярную переменную "@Username".

4b9b3361

Ответ 1

Объем переменной в Transact-SQL ограничен пакетом. Ваш script содержит две партии, разделенные "GO"

Ответ 2

Существует GO внутри вашего script, GO делит ваш script на две партии, поэтому вам нужно переопределить все используемые переменные после GO, потому что область ограничена этой партией.

Кстати: я не думаю, что это GO необходимо, не так ли?

Благодаря @gbn и @alexm, дающим подсказку, GO отдельные операторы в партии, а не транзакции, см. также http://msdn.microsoft.com/en-us/library/ms188037.aspx

Ответ 3

GO разделяет партии и является клиентской командой, а не сервером. Таким образом, сервер получает вторую партию отдельно как новый запрос, и в этом переменная не объявляется.

Если вы попытаетесь сделать следующее, вы получите сообщение об ошибке, потому что сервер не понимает команду GO:

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

Сервер не будет разделять это на две партии, потому что партии - это вещи, переданные клиенту клиенту.

Ответ 4

Как только вы написали GO, @Username недоступно для запроса SELECT.

Ответ 5

вам нужно переопределить @Username после GO statement