SQL-Serverでテーブル変数を削除するにはどうすればよいですか?私もこれをする必要がありますか?


123

スクリプトにテーブル変数があります(ストアドプロシージャではありません)。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

自分でドロップすることはできないため、質問の2番目の部分は適用されません。
マーティン・スミス

回答:


189

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


17
+1-また、必要に応じてそれらをドロップすることはできません。他の変数と同様に、セッションが開いている間は保持されます。また、トランザクションの影響も受けません。
JNK

10
@JNKは、それらがトランザクションの影響を受けないことを指摘することが重要です。テーブル変数を使用してデータを保持し、エラーが原因でロールバックが発生した後にログテーブルに書き込むことができます。
HLGEM 2011

3
いいえ、同じではありません。一時テーブルはトランザクションに参加します。
ポールペリニー

また、CTEと同じではありません。
ホーガン

それらをドロップすることはできませんが、それらを削除することはできます 'delete @projectList';)
RK Sharma

29

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

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

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


1
テーブル変数によって作成されたtempdbオブジェクトがスコープ外になったときにクリーンアップされるかどうかを知っていますか?または、サーバーはセッションを閉じるまで待機してからクリーンアップしますか?
StriplingWarrior

21

他の誰かがこれに遭遇した場合...そして本当にループのようにそれをドロップする必要がある場合は、テーブル変数からすべてを削除することができます:

DELETE FROM @tableVariableName

7

ただし、変数テーブルがループ内で使用されている場合は、ループ内でデータを再度ロードする前に、空にする(@tableを削除する)必要があることを皆さんがすべて忘れていました。


3

TempTableと同様に、ローカルテーブル変数もTempDBに作成されます。テーブル変数のスコープは、それが宣言されているバッチ、ストアドプロシージャ、およびステートメントブロックです。プロシージャ間でパラメータとして渡すことができます。作成したセッションを閉じると、自動的に削除されます。


#tempテーブルは@table変数と同じではなく、パッチまたはスコープの終了後に自動的にドロップされません。ストアドプロシージャ内で作成され、ストアドプロシージャの実行が終了した場合にのみ自動的にドロップされます
Abou-Emish

1

これが解決策です

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

SQL Server 2014で問題なく動作するChristophe

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.