1. ホーム
  2. データベース
  3. mssql2005

SQLserverにおけるdeclare変数の使用法

2022-01-20 04:40:59

SQLにおけるdeclareの使用法

SQLの具体的な構文を探ったことはありませんが、いつもc#に従ってSQLを真似ています。数日前、私のプロジェクトで問題に遭遇し、declare defined variablesのスコープに興味を持つようになりました。

我々はすべて、我々は変数を定義した場合、彼の役割は、もしの終わりまで、外は変数を識別するためにされていない場合は、使用することはできません他の場合は、単に書き込みで、C#のローカル変数を知っている。 /変数は、もしの外側に認識されていない、とelseで使用することはできません。

if(true)
{
Int32i=1;
Console.WriteLine(i);
}

このiのスコープはifの内側で、もしこの変数をifの外側で使うなら

if(true)
{
Int32i=1;
Console.WriteLine(i);
}
Console.WriteLine(i);

次に、2つ目の出力文はエラーを報告します

名前 'i' は現在のコンテキストに存在しません。

これは、i がスコープ外であることを意味します。

では、このコードをsqlで書いたらどうなるでしょうか?まず、ifの中に書きます。

IF1=1
BEGIN
DECLARE@testVARCHAR
SET@test='1'
PRINT'inif:'+@test
END

  実行し、期待通りの結果であるif:1に出力される結果を確認してください。次に、ifの外で変数@testを使用してみましょう。

IF1=1
BEGIN
DECLARE@testVARCHAR
SET@test='1'
PRINT'inif:'+@test
END
PRINT'outif:'+@test

みなさんがどう思うかわかりませんが、私の脳は、これは変数のスコープ外なので、エラーを報告するはずだと考えているのです。実際の結果は、エラーにならないばかりか、@testの値がそのまま残っています。

in if:1

アウト if:1

この結果を見て、当時は落ち込みました。SQLがあまりにも予想外だったからです。

SQL SERVER 2005のヘルプのdeclareのところで、3行目の注釈 "ローカル変数のスコープは、それが宣言されたバッチです"

Msdnのアドレスです。 http://msdn.microsoft.com/zh-cn/library/ms188927.aspx

この線は、これだけ大きな作品ではかなり控えめなものです。

これで、declare変数のスコープはその変数があるバッチであり、ifはそのスコープをブロックしないことがわかりました。したがって、上のコードのifの中と外のコードはバッチ内にあり、@testは利用でき、ifの中に設定した値もそのまま利用できます。

コードを修正する方法は以下の通りです。GO文はSQLでバッチを区別するために使用されます。

IF1=1
BEGIN
DECLARE@testVARCHAR
SET@test='1'
PRINT'inif:'+@test
END
GO
PRINT'outif:'+@test

その通りです。SQLで構文を確認すると、「Must declare scalar variable "@test"" 」というエラーが表示されます。

注:GO は sql 文の最後に使用します。例えば、次のようなバッチ文です。 select *from ,b select *from a の最後の select の後に GO を付けて、2つの sql 文を一度に実行できるようにします。

今回の記事は、SQLサーバーのdeclare変数の使い方についてです。SQLサーバーのdeclare変数についてのより詳しい情報は、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続きご覧になってください。