web-dev-qa-db-fra.com

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

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

  1. Comment puis-je 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
109
jtpereyda

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

166
Hogan

Les variables de table ressemblent aux variables int ou varchar.

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

La portée d'une variable correspond à la plage d'instructions Transact-SQL pouvant faire référence à la variable. La portée d'une variable dure à partir 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.

29
gbn

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

DELETE FROM @tableVariableName
16
Leo Much

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

4
Peppe

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 lequel elle est déclarée. Ils peuvent être transmis en tant que paramètres entre procédures. Ils sont automatiquement supprimés lorsque vous fermez la session sur laquelle vous les créez.

3
Gagan

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

1
CSonneck