web-dev-qa-db-fra.com

Est-il possible d'obtenir une liste de toutes les tables temporaires actuelles dans SQL Server?

Je réalise que les tables temporaires sont liées à la session/connexion et non visibles ou accessibles hors de la session/connexion.

J'ai une longue procédure stockée qui crée des tables temporaires à différentes étapes.

Existe-t-il un moyen de voir la liste des tables temporaires actuelles? De quels privilèges ai-je besoin pour pouvoir le faire?

Alternativement

Existe-t-il un moyen de voir l’instruction SQL particulière en cours d’exécution dans une procédure stockée en cours? La procédure s'exécute en tant que travail planifié dans SQL Server.

J'utilise SQL Server 2000.

Merci pour vos conseils.

59
AAsk

Est-ce ce que vous recherchez?

select * from tempdb..sysobjects
--for sql-server 2000 and later versions

select * from tempdb.sys.objects
--for sql-server 2005 and later versions
93
Sandro

Vous pouvez obtenir la liste des tables temporaires en suivant la requête:

select left(name, charindex('_',name)-1) 
from tempdb..sysobjects
where charindex('_',name) > 0 and
xtype = 'u' and not object_id('tempdb..'+name) is null
8
Upendra Chaudhari
SELECT left(NAME, charindex('_', NAME) - 1)
FROM tempdb..sysobjects
WHERE NAME LIKE '#%'
    AND NAME NOT LIKE '##%'
    AND upper(xtype) = 'U'
    AND NOT object_id('tempdb..' + NAME) IS NULL

vous pouvez supprimer la ligne ## si vous souhaitez inclure des tables temporaires globales.

2
FLICKER

Pour SQL Server 2000, cela devrait vous indiquer uniquement les tables #temp de votre session. (Adapté de mon exemple pour les versions plus modernes de SQL Server ici .) Cela suppose que vous ne nommez pas vos tables avec trois caractères de soulignement consécutifs, comme CREATE TABLE #foo___bar:

SELECT 
  name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1),
  t.id
FROM tempdb..sysobjects AS t
WHERE t.name LIKE '#%[_][_][_]%'
AND t.id = 
  OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1));
2
Aaron Bertrand

Si vous avez besoin de "voir" la liste des tables temporaires, vous pouvez simplement enregistrer les noms utilisés. (et comme d'autres l'ont noté, il est possible d'interroger directement cette information)

Si vous devez "voir" le contenu des tables temporaires, vous devrez créer de vraies tables avec un nom temporaire (unique).

Vous pouvez suivre le SQL en cours d'exécution à l'aide de SQL Profiler:

[Ces articles visent les versions de SQL Server ultérieures à 2000, mais la plupart des conseils sont les mêmes.]

Si votre processus est long et important pour votre entreprise, il est judicieux de consigner diverses étapes (nom/numéro d'étape, heure de début et de fin) dans le processus. De cette façon, vous disposez d’une base de référence à comparer lorsque les choses ne fonctionnent pas bien, et vous pouvez identifier plus rapidement la ou les étapes à l’origine du problème.

2
Mitch Wheat