Bagaimana cara menghapus variabel tabel di SQL-Server? Haruskah saya melakukan ini?


123

Saya memiliki variabel tabel dalam skrip (bukan prosedur tersimpan). Dua pertanyaan:

  1. Bagaimana cara menghapus variabel tabel? Drop Table @ varName memberikan kesalahan "snytax salah".
  2. Haruskah saya selalu melakukan ini? Saya dengar ini praktik yang baik. Apakah benar-benar perlu untuk skrip kecil seperti ini?

Ini kode saya:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work

Anda tidak dapat membatalkannya sendiri sehingga bagian kedua dari pertanyaan Anda tidak berlaku.
Martin Smith

Jawaban:


189

Variabel tabel secara otomatis lokal dan otomatis dihapus - Anda tidak perlu mengkhawatirkannya.


17
+1 - Anda juga tidak dapat membatalkannya bahkan jika Anda ingin - mereka tetap ada selama sesi terbuka, sama seperti variabel lainnya. Mereka juga tidak terpengaruh oleh transaksi.
JNK

10
@JNKs poin tentang mereka yang tidak terpengaruh oleh transaksi itu penting, Anda dapat menggunakan variabel tabel untuk menyimpan data dan menulis ke tabel log setelah kesalahan menyebabkan rollback.
HLGEM

3
Tidak, itu tidak sama. Tabel temp berpartisipasi dalam transaksi.
Paul Perigny

Juga tidak sama dengan CTE.
Hogan

Anda tidak dapat menjatuhkannya tetapi Anda dapat menghapusnya 'delete @projectList';)
RK Sharma

29

Variabel tabel seperti variabel int atau varchar.

Anda tidak perlu menjatuhkannya. Mereka memiliki aturan cakupan yang sama dengan variabel int atau varchar

Cakupan variabel adalah rentang pernyataan Transact-SQL yang dapat mereferensikan variabel. Cakupan variabel berlangsung dari titik dideklarasikan hingga akhir batch atau prosedur tersimpan di mana ia dideklarasikan.


1
Apakah Anda tahu apakah objek tempdb yang dibuat oleh variabel tabel dibersihkan ketika mereka keluar dari ruang lingkup? Atau apakah server menunggu sampai sesi ditutup sebelum membersihkannya?
StriplingWarrior

21

jika orang lain menemukan ini ... dan Anda benar-benar perlu melepaskannya seperti saat berada dalam satu lingkaran, Anda dapat menghapus semua dari variabel tabel:

DELETE FROM @tableVariableName

7

Tetapi Anda semua lupa menyebutkan, bahwa jika tabel variabel digunakan dalam satu loop, maka perlu dikosongkan (hapus @table) sebelum memuat data lagi dalam satu loop.


3

Sama Seperti TempTables, variabel tabel lokal juga dibuat di TempDB. Ruang lingkup variabel tabel adalah batch, prosedur tersimpan dan blok pernyataan di mana ia dideklarasikan. Mereka dapat dikirimkan sebagai parameter antar prosedur. Mereka secara otomatis terhapus saat Anda menutup sesi tempat Anda membuatnya.


#temp table tidak sama dengan variabel @table, ia tidak turun secara otomatis setelah akhir patch atau scope, itu turun secara otomatis hanya jika dibuat di dalam prosedur tersimpan dan prosedur tersimpan selesai dijalankan
Abou-Emish

1

Inilah solusinya

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;

Berfungsi dengan baik di SQL Server 2014 Christophe

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.