不明白错误信息:必须声明标量变量“@Username”。
Posted
技术标签:
【中文标题】不明白错误信息:必须声明标量变量“@Username”。【英文标题】:Don't understand error message: Must declare the scalar variable "@Username". 【发布时间】:2012-01-05 08:33:16 【问题描述】:我有一个简单的脚本更新并显示一个用户帐户。 (与管理工作室合作 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
消息 137,第 15 级,状态 2,第 3 行 必须声明标量变量“@Username”。
【问题讨论】:
您的变量命名可能存在区分大小写的问题。重新检查您的 sql 脚本.. 【参考方案1】:Transact-SQL 中变量的范围受批处理的限制。 您的脚本包含由“GO”分隔的两个批次
【讨论】:
+1 表示清楚'您的脚本包含两个由“GO”分隔的批次'【参考方案2】:你的脚本里面有一个GO
,GO
把你的脚本分成两批,所以GO
之后必须重新定义所有使用的变量,因为范围仅限于这一批。
顺便说一句:我不认为这个GO
是必要的,不是吗?
感谢@gbn 和@alexm 的提示,GO
将语句分成批处理而不是事务,另请参阅http://msdn.microsoft.com/en-us/library/ms188037.aspx
【讨论】:
写事务是什么意思? AFAIKGO
与事务没有任何共同之处(严格意义上的数据库)。
我说的是,我对 SQL 很陌生。我什么时候需要 GO 语句?
@LuukKrijnen:例如***.com/q/971177/27535。此外,alexm 的答案是正确的。
@rabudde:这在几个方面是不正确的:GO 是一个分隔批次的客户端指令。不是交易。数据库服务器不理解。【参考方案3】:
GO
分隔批次,是客户端指令,而不是服务器指令。因此,服务器将第二批作为新查询单独接收,并且在此未声明变量。
如果你尝试执行以下操作会报错,因为服务器不理解命令GO
:
DECLARE @SQL varchar(1000);
SET @SQL = 'PRINT ''hello'';
GO
PRINT ''goodbye'';';
服务器不会把它分成两个批次,因为批次是客户端提交给服务器的东西。
【讨论】:
【参考方案4】:一旦你写了 GO,@Username 就不能用于 SELECT 查询了。
【讨论】:
【参考方案5】:你必须在GO
声明之后重新定义@Username
【讨论】:
以上是关于不明白错误信息:必须声明标量变量“@Username”。的主要内容,如果未能解决你的问题,请参考以下文章