我有一个简单的脚本更新并显示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”。
答案 0 :(得分:55)
Transact-SQL中的变量范围受批处理限制。 您的脚本包含两个以“GO”分隔的批次
答案 1 :(得分:6)
您的脚本中有GO
,GO
将您的脚本分成两批,因此必须在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