web-dev-qa-db-ja.com

SQL-Serverでテーブル変数を削除するにはどうすればよいですか?私もこれをすべきですか?

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

  1. テーブル変数を削除するにはどうすればよいですか?ドロップテーブル@varNameは、「Innyny 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
109
jtpereyda

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

166
Hogan

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

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

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

29
gbn

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

DELETE FROM @tableVariableName
16
Leo Much

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

4
Peppe

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

3
Gagan

ここに解決策があります

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で正常に動作します

1
CSonneck