Comment supprimer des variables de table dans SQL-Server? Dois-je même faire ça?


123

J'ai une variable de table dans un script (pas une procédure stockée). Deux questions:

  1. Comment supprimer la variable de table? Drop Table @varName donne une erreur "incorrect snytax".
  2. Dois-je toujours faire ça? J'entends que c'est une bonne pratique. Est-ce vraiment nécessaire pour de petits scripts comme celui-ci?

Voici mon code:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work

Vous ne pouvez pas les supprimer vous-même, donc la deuxième partie de votre question ne s'applique pas.
Martin Smith

Réponses:


189

Les variables de table sont automatiquement locales et automatiquement supprimées - vous n'avez pas à vous en soucier.


17
+1 - De plus, vous ne pouvez pas les supprimer même si vous le souhaitez - ils persistent tant que la session est ouverte, comme toute autre variable. Ils ne sont pas non plus affectés par les transactions.
JNK

10
@JNKs indique qu'il n'est pas affecté par les transactions, vous pouvez utiliser des variables de table pour contenir des données et écrire dans une table de journal après qu'une erreur provoque une restauration.
HLGEM

3
Non, ce n'est pas pareil. Les tables temporaires participent aux transactions.
Paul Perigny

Ils ne sont pas non plus les mêmes que les CTE.
Hogan

vous ne pouvez pas les supprimer mais vous pouvez les supprimer 'delete @projectList';)
RK Sharma

29

Les variables de table sont exactement comme les variables int ou varchar.

Vous n'avez pas besoin de les laisser tomber. Ils ont les mêmes règles de portée que les variables int ou varchar

La portée d'une variable est la plage d'instructions Transact-SQL qui peuvent référencer la variable. La portée d'une variable dure du moment où elle est déclarée jusqu'à la fin du lot ou de la procédure stockée dans laquelle elle est déclarée.


1
Savez-vous si les objets tempdb créés par les variables de table sont nettoyés lorsqu'ils sont hors de portée? Ou le serveur attend-il que la session soit fermée avant de les nettoyer?
StriplingWarrior

21

si quelqu'un d'autre rencontre cela ... et que vous devez vraiment le supprimer comme dans une boucle, vous pouvez simplement tout supprimer de la variable de table:

DELETE FROM @tableVariableName

7

Mais vous avez tous oublié de mentionner que si une table de variables est utilisée dans une boucle, elle devra être vidée (supprimer @table) avant de charger à nouveau les données dans une boucle.


3

Tout comme TempTables, une variable de table locale est également créée dans TempDB. La portée de la variable de table est le lot, la procédure stockée et le bloc d'instructions dans lesquels elle est déclarée. Ils peuvent être passés en tant que paramètres entre les procédures. Ils sont automatiquement supprimés lorsque vous fermez la session sur laquelle vous les créez.


La table #temp n'est pas la même que la variable @table, elle ne tombe pas automatiquement après la fin du patch ou de la portée, elle est automatiquement supprimée uniquement si elle a été créée à l'intérieur de la procédure stockée et la procédure stockée a terminé son exécution
Abou-Emish

1

Voici une solution

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;

Fonctionne bien sur SQL Server 2014 Christophe

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.