不明白错误消息:必须声明标量变量“@Username”。

时间:2012-01-05 08:33:17

标签: sql

我有一个简单的脚本更新并显示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

Msg 137,Level 15,State 2,Line 3 必须声明标量变量“@Username”。

5 个答案:

答案 0 :(得分:55)

Transact-SQL中的变量范围受批处理限制。 您的脚本包含两个以“GO”分隔的批次

答案 1 :(得分:6)

您的脚本中有GOGO将您的脚本分成两批,因此必须在GO之后重新定义所有使用的变量,因为范围仅限于此批次

顺便说一句:我不认为这个GO是必要的,不是吗?

感谢@gbn和@alexm给出提示,GO个单独的语句分批而不是交易,另请参阅http://msdn.microsoft.com/en-us/library/ms188037.aspx

答案 2 :(得分:1)

GO分隔批次并且是客户端指令,而不是服务器指令。因此,服务器作为新查询单独接收第二批,并且在此不声明变量。

如果您尝试执行以下操作,则会收到错误,因为服务器不理解命令GO

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

服务器不会将其拆分为两批,因为批处理是客户端提交给服务器的内容。

答案 3 :(得分:0)

一旦你写了GO,@ Username就无法用于SELECT查询。

答案 4 :(得分:0)

您必须在@Username声明

之后重新定义GO