141

スクリプトにテーブル変数があります (ストアド プロシージャではありません)。2 つの質問:

  1. テーブル変数を削除するにはどうすればよいですか? テーブルの @varName をドロップすると、「snytax が正しくありません」というエラーが発生します。
  2. 私は常にこれを行う必要がありますか?良い習慣だと聞きます。このような小さなスクリプトに本当に必要ですか?

これが私のコードです:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work
4

8 に答える 8

217

テーブル変数は自動的にローカルになり、自動的に削除されます。心配する必要はありません。

于 2011-04-13T18:01:40.597 に答える
31

テーブル変数は、int または varchar 変数と同様です。

それらをドロップする必要はありません。int または varchar 変数と同じスコープ規則を持っている

変数のスコープは、変数を参照できる Transact-SQL ステートメントの範囲です。変数のスコープは、変数が宣言された時点から、変数が宣言されたバッチまたはストアド プロシージャの最後まで続きます。

于 2011-04-13T18:04:22.453 に答える
0

実際、 をドロップする必要はありません@local_variable

しかし、 を使えば#local_tableそれも可能です。たとえば、クエリを何度も再実行できると便利です。

SELECT *
INTO #recent_records
FROM dbo.my_table t
WHERE t.CreatedOn > '2021-01-01'
;

SELECT *
FROM #recent_records
;

/*
  can DROP here, otherwise will fail with the following error
  on re-execution in the same window (I use SSMS DB client):

  Msg 2714, Level ..., State ..., Line ...
  There is already an object named '#recent_records' in the database.
*/
DROP TABLE #recent_records
;

明示的な DROP なしで再実行できるように、SELECT ステートメントを TRANSACTION に入れることもできます。

BEGIN TRANSACTION

  SELECT *
  INTO #recent_records
  FROM dbo.my_table t
  WHERE t.CreatedOn > '2021-01-01'
  ;

  SELECT *
  FROM #recent_records
  ;

ROLLBACK
于 2021-01-12T17:15:04.773 に答える