2012-01-05 14 views
16

私は簡単なスクリプトを更新し、ユーザーアカウントを表示しています。 (管理スタジオ2010での作業) ユーザーのエラーを防ぐために、私はSQLで変数を使用したい(以前はこれをしていなかった)。エラーメッセージを理解できません:スカラー変数 "@Username"を宣言しなければなりません。

チュートリアルを読むときは、エラーメッセージが表示されている以外は、以下のコードサンプルと同じように簡単にする必要があります。 Webで同じエラーの人を検索すると、同じエラーで非常に複雑なコードが表示されてしまいます。誰かが私に手がかりを与えることができますか?

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" を宣言する必要があります。

+0

変数の命名で大文字と小文字の区別が問題になることがあります。SQLスクリプトを確認してください。 – VS1

答えて

52

@UsernameGO後に声明を再定義する必要があります。 スクリプトは

+4

「バッチ」と言われる唯一の答えは+1 – gbn

+0

+1「あなたのスクリプトには「GO」で区切られた2つのバッチが含まれています –

6

GOはとても範囲はこのバッチに制限されているため、GO後にすべて使用される変数を再定義する必要が二つのバッチにスクリプトを分割し、スクリプト内のGOがあります。

ところで:これはGOが必要ではないと思いますか?あなたがGOを書くたら見もhttp://msdn.microsoft.com/en-us/library/ms188037.aspx

+2

*トランザクション*を書くのはどういう意味ですか? AFAIK 'GO'は取引とは全く関係がありません(厳密にはデータベースの意味で)。 –

+0

私が言っていることは、私はむしろSQLにとって新しいことです。いつ私はGOの声明が必要ですか?例えば、 –

+0

@LuukKrijnen:http://stackoverflow.com/q/971177/27535。また、アレクムの答えは正しいものです。 – gbn

0

@gbnとヒントを与えて@alexm、バッチにGO別々のステートメントことはなく、トランザクションにする

おかげで、@Usernameは、クエリを選択することができません。

0

あなたは、Transact-SQLでの変数のスコープはバッチによって制限されている

1

GOはバッチを分離し、クライアント命令、ないサーバー 1である「GO」で区切られた2つのバッチが含まれています。したがって、サーバーは別のバッチを新しいクエリとして別々に受信し、この変数は宣言されません。

サーバーがコマンドGOを理解していないので、あなたがエラーを取得する次の操作を実行しようとした場合:

DECLARE @SQL varchar(1000); 
SET @SQL = 'PRINT ''hello''; 
GO 
PRINT ''goodbye'';'; 
バッチが提出したものであるため、

サーバは、二つのバッチにこれを分割しません。クライアントによってサーバーに送信されます。

関連する問題