Ответ 1
Объем переменной в Transact-SQL ограничен пакетом. Ваш script содержит две партии, разделенные "GO"
У меня есть простое обновление 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".
Объем переменной в Transact-SQL ограничен пакетом. Ваш script содержит две партии, разделенные "GO"
Существует GO
внутри вашего script, GO
делит ваш script на две партии, поэтому вам нужно переопределить все используемые переменные после GO
, потому что область ограничена этой партией.
Кстати: я не думаю, что это GO
необходимо, не так ли?
Благодаря @gbn и @alexm, дающим подсказку, GO
отдельные операторы в партии, а не транзакции, см. также http://msdn.microsoft.com/en-us/library/ms188037.aspx
GO
разделяет партии и является клиентской командой, а не сервером. Таким образом, сервер получает вторую партию отдельно как новый запрос, и в этом переменная не объявляется.
Если вы попытаетесь сделать следующее, вы получите сообщение об ошибке, потому что сервер не понимает команду GO
:
DECLARE @SQL varchar(1000);
SET @SQL = 'PRINT ''hello'';
GO
PRINT ''goodbye'';';
Сервер не будет разделять это на две партии, потому что партии - это вещи, переданные клиенту клиенту.
Как только вы написали GO, @Username недоступно для запроса SELECT.
вам нужно переопределить @Username
после GO
statement