Tronquer/Effacer une variable de table dans Sql Server 2008
Est-il possible de tronquer ou de débusquer une variable de table dans sql server 2008 ?
Declare @tableVariable table
(
id int,
value varchar(20)
)
while @start<=@stop
begin
insert into @tableVariable(id,value)
select id
, value
from xTable
where id=@start
--Use @tableVariable
--@tableVariable should be flushed out of
-- old values before inserting new values
set @start = @start + 1
end
- Qu'est-ce exactement que vous voulez accomplir? Pourquoi insérer quoi que ce soit si vous êtes juste de rincer à nouveau?
- Insérez symbolique ici. L'opération est beaucoup plus complexe et implique un grand nombre d'autres tables
- Il y a le commentaire
--Use @tableVariable
je suppose qu'il sera utilisé pour certains calculs, qui ne sont pas clos - Oui.. il sera utilisé pour certains calculs.. s'il vous plaît ne pas se confondre avec l'UTILISATION <somedatabase>
Vous devez vous connecter pour publier un commentaire.
il suffit de supprimer tout
Non, vous ne pouvez pas
TRUNCATE
une variable de table, car il n'est pas une table physique. Le supprimer serait plus rapide. Voir cette réponse de Aaron Bertrand.TRUNCATE
serait certainement plus rapide. La suppression d'une variable de table est connecté à latempdb
journal des transactions.Je voudrais ajouter à la "techniquement" bonne réponse de à l'aide de
DELETE @VariableTable
que s'il vous arrive d'avoir aussi une Identité-Champ dans votre@Table
Variable (par exemple,i int (1,1)
) et que vous souhaitez réutiliser cette table (même si vous avez re-déclarer dans une boucle), il est toujours dans son champ d'application et il aucun moyen de reseed il soit.Voir: Tableau Variable De La Colonne D'Identité
Il est préférable d'utiliser
#TempTable
dans ces cas - alors vous pouvez Tronquer ou utilisez DBCC pour réensemencer.Vous récolterez des améliorations de performances avec Tronquer et être en mesure de créer des index supplémentaires.
Je pense que la règle de base est que, si vous allez jamais à supprimer tout le contenu à l'aide de
DELETE @VariableTable
, alors vous avez introduit un code-odeur qui dit, vous devriez avoir utilisé#TempTable
etTRUNCATE
à la place.Table de variables ne prennent pas en charge
TRUNCATE
syntaxe - la seule façon de les tronquer est implicitement par les laisser tomber hors de portée.À la fois temporaire et des tables de variables peut être mis en cache lorsqu'utilisés dans des procédures stockées et les ci-dessous pourraient bien se retrouver à la même table que les variables utilisées après la troncature plutôt que d'une baisse effective et créer
Bien sûr une bien meilleure alternative serait de passer à l'utilisation d'un
#temp
table à la place que prend en chargeTRUNCATE
directement.DML sur les deux variables de table et les tables temporaires écrit à la
tempdb
journal des transactions. Si oui ou non il vaut la peine de commutation àTRUNCATE
plutôt queDELETE
dépend de la taille des données.TRUNCATE
aura suffit de vous connecter à la page deallocations.DELETE
journal des réelles valeurs supprimées. Une autre différence entre les deux est queTRUNCATE
libère la dernière page de la table etDELETE
ne l'est pas. Si seulement une petite quantité de données est insérée et supprimés dans chaque itération de boucle, puis la surcharge de se connecter les lignes supprimées peut-être moins que la surcharge constante de libérer et réaffectation de la page dans la table.Inversement, si vous serez l'insertion et la suppression de grandes quantités de données à chaque itération, vous pouvez constater que
TRUNCATE
non seulement rend l'opération de suppression de toutes les lignes plus efficace mais peuvent également bénéficier de la subséquente instruction insert.DELETE FROM @tableVariable
, comme décrit dans la accepté de répondre, pour obtenir une fonctionnalité équivalente àTRUNCATE TABLE
(sauf pour l'abattage - ce pourrait certainement être un problème si il y avait beaucoup de lignes dans la variable, ou le SQL qui a créé la variable a été exécuté très souvent).TRUNCATE
a plus deDELETE
de toutes les lignes est de l'enregistrement des transactions.Je sais que c'est une vieille question, mais j'ai pensé un moyen pour ce faire.
on avait des tables avec des millions de lignes et n'a pas voulu supprimer en raison de l'espace journal des transactions.
Créer une procédure que vous passez dans le nom de la table que vous souhaitez tronquer, la procédure va créer une autre procédure qui ne le trucate, puis de supprimer les procédures.
Espère que cette aide.