スクリプトにテーブル変数があります(ストアドプロシージャではありません)。 2つの質問:
私のコードは次のとおりです。
Declare @projectList table(
name varchar(40) NOT NULL);
Insert Into @projectList
Values ('BCR-00021')
Select *
From @projectList
Drop Table @projectList -- does not work
テーブル変数は自動的にローカルになり、自動的に削除されます。心配する必要はありません。
テーブル変数は、intまたはvarchar変数と同じです。
それらをドロップする必要はありません。これらはintまたはvarchar変数と同じ scope ルールを持っています
変数のスコープは、変数を参照できるTransact-SQLステートメントの範囲です。変数のスコープは、変数が宣言された時点から、変数が宣言されたバッチまたはストアドプロシージャの終わりまで続きます。
他の誰かがこれに遭遇した場合...そしてあなたが本当にループ中にそれをドロップする必要がある場合、あなたはテーブル変数からすべてを削除することができます:
DELETE FROM @tableVariableName
しかし、ループ内で変数テーブルを使用する場合、ループ内でデータを再度ロードする前に空にする(@tableを削除する)必要があることを、忘れてしまいました。
TempTablesと同様に、ローカルテーブル変数もTempDBに作成されます。テーブル変数のスコープは、それが宣言されているバッチ、ストアドプロシージャ、およびステートメントブロックです。プロシージャ間でパラメータとして渡すことができます。それらは、作成したセッションを閉じると自動的に削除されます。
ここに解決策があります
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で正常に動作します