不明白错误信息:必须声明标量变量“@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】:

你的脚本里面有一个GOGO把你的脚本分成两批,所以GO之后必须重新定义所有使用的变量,因为范围仅限于这一批。

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

感谢@gbn 和@alexm 的提示,GO 将语句分成批处理而不是事务,另请参阅http://msdn.microsoft.com/en-us/library/ms188037.aspx

【讨论】:

事务是什么意思? AFAIK GO 与事务没有任何共同之处(严格意义上的数据库)。 我说的是,我对 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”。的主要内容,如果未能解决你的问题,请参考以下文章

sql必须声明标量变量错误

不正确的语法必须声明标量变量

必须声明标量变量错误 ADO.NET

例外 |必须声明标量变量@IdAlbum

表变量和错误“必须声明标量变量”

sql数据库错误“必须声明标量变量”