Tablo değişkenlerini SQL-Server'a nasıl bırakırım? Bunu bile yapmalı mıyım?


123

Komut dosyasında bir tablo değişkenim var (depolanmış bir prosedür değil). İki soru:

  1. Tablo değişkenini nasıl bırakırım? Tablo düşürme @varName "Yanlış snytax" hatası veriyor.
  2. Bunu her zaman yapmalı mıyım? Bunun iyi bir uygulama olduğunu duydum. Bunun gibi küçük senaryolar için gerçekten gerekli mi?

İşte kodum:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work

Bunları kendiniz bırakamazsınız, bu nedenle sorunuzun 2. kısmı geçerli olmaz.
Martin Smith

Yanıtlar:


189

Tablo değişkenleri otomatik olarak yereldir ve otomatik olarak atılır - bunun için endişelenmenize gerek yoktur.


17
+1 - Ayrıca isteseniz bile onları bırakamazsınız - tıpkı diğer değişkenler gibi oturum açık olduğu sürece devam ederler. İşlemlerden de etkilenmezler.
JNK

10
@JNK'ler, işlemlerden etkilenmediklerini işaret etmek önemlidir, verileri tutmak ve bir hata geri dönüşe neden olduktan sonra bir günlük tablosuna yazmak için tablo değişkenlerini kullanabilirsiniz.
HLGEM

3
Hayır, aynı değil. Geçici tablolar işlemlere katılır.
Paul Perigny

CTE'lerle aynı değiller.
Hogan

onları bırakamazsınız ancak 'delete @projectList';)
RK Sharma

29

Tablo değişkenleri tıpkı int veya varchar değişkenleri gibidir.

Onları düşürmenize gerek yok. İnt veya varchar değişkenleriyle aynı kapsam kurallarına sahiptirler

Bir değişkenin kapsamı, değişkene başvurabilen Transact-SQL deyimlerinin aralığıdır. Bir değişkenin kapsamı bildirildiği noktadan bildirildiği toplu iş veya saklı yordamın sonuna kadar sürer.


1
Tablo değişkenleri tarafından oluşturulan tempdb nesnelerinin kapsam dışına çıktıklarında temizlenip temizlenmediğini biliyor musunuz? Yoksa sunucu, onları temizlemeden önce oturumun kapanmasını mı bekler?
StriplingWarrior

21

başka biri bununla karşılaşırsa ... ve gerçekten bir döngüdeymiş gibi bırakmanız gerekirse, tablo değişkeninden tümünü silebilirsiniz:

DELETE FROM @tableVariableName

7

Ancak, bir döngü içinde değişken bir tablo kullanılıyorsa, bir döngü içinde tekrar verilerle yüklenmeden önce boşaltılması (@table'ı) gerekeceğini belirtmeyi unuttunuz.


3

TempTables gibi, bir yerel tablo değişkeni de TempDB'de oluşturulur. Tablo değişkeninin kapsamı, bildirildiği toplu iş, saklı yordam ve ifade bloğudur. Prosedürler arasında parametre olarak geçirilebilirler. Onları oluşturduğunuz oturumu kapattığınızda otomatik olarak bırakılırlar.


#temp tablosu @table değişkeniyle aynı değildir, yama veya kapsamın bitiminden sonra otomatik olarak düşmez, yalnızca saklı yordamın içinde oluşturulmuşsa ve saklı yordamın yürütülmesi tamamlandığında otomatik olarak bırakılır
Abou-Emish

1

İşte bir çözüm

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'da sorunsuz çalışıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.