OVH Cloud OVH Cloud

Comment savoir si une table temporaire existe ?

5 réponses
Avatar
tintin
Bonjour,

Pour savoir si une table existe, je teste
select * from sysobjects where type='U' and name = 'nomtable'

Mais après avoir créé une table temporaire #temp, la requête :
select * from sysobjects where type='U' and name = '#temp'

ne retourne rien, en restant bien sûr dans la même connexion.

Y-a-il un autre moyen de savoir si la table temporaire existe ?

Merci de votre aide !

5 réponses

Avatar
Fred BROUARD
Ne JAMAIS utiliser les tables systèmes dans le code SQL d'un développement. En
effet ces tables sont sujettes à changement de la parte de l'éditeur.
En revanche tu dispose des vues d'informations de schéma pour cela, mais aussi
de proc stock et d'UDF !

MAIS...

pour te répondre :
-- teste l'existance d'une table temporaire locale
-- de nom #DIRECTORY pour la virer
IF EXISTS (SELECT *
FROM tempdb.INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = 'tempdb'
AND TABLE_SCHEMA = USER
AND TABLE_NAME = (SELECT name
FROM tempdb..sysobjects
WHERE id = OBJECT_ID('tempdb..#DIRECTORY')))
DROP TABLE #DIRECTORY

C'est le seul cas ou il faut passer par l'intermédiaire d'une table système !!!

A +

tintin a écrit:
Bonjour,

Pour savoir si une table existe, je teste
select * from sysobjects where type='U' and name = 'nomtable'

Mais après avoir créé une table temporaire #temp, la requête :
select * from sysobjects where type='U' and name = '#temp'

ne retourne rien, en restant bien sûr dans la même connexion.

Y-a-il un autre moyen de savoir si la table temporaire existe ?

Merci de votre aide !





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
tintin
Je voudrais bien ne pas utiliser les tables systèmes, mais il est nécessaire,
dans nombreux cas, de savoir si un objet existe.

Alors, pour mon info, est-ce que les versions récentes de SQL Server (2005)
ont une clause du genre "drop table nomtable if exists", ou approchant,
ainsi que cela existe depuis longtemps dans MySql ?

Peut-être n'est ce pas dans la norme SQL ANSI... mais cela me ferait marrer
que cet argument soit employé par MS...

Merci de l'info.

"Fred BROUARD" a écrit :

Ne JAMAIS utiliser les tables systèmes dans le code SQL d'un développement. En
effet ces tables sont sujettes à changement de la parte de l'éditeur.
En revanche tu dispose des vues d'informations de schéma pour cela, mais aussi
de proc stock et d'UDF !

MAIS...

pour te répondre :
-- teste l'existance d'une table temporaire locale
-- de nom #DIRECTORY pour la virer
IF EXISTS (SELECT *
FROM tempdb.INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = 'tempdb'
AND TABLE_SCHEMA = USER
AND TABLE_NAME = (SELECT name
FROM tempdb..sysobjects
WHERE id = OBJECT_ID('tempdb..#DIRECTORY')))
DROP TABLE #DIRECTORY

C'est le seul cas ou il faut passer par l'intermédiaire d'une table système !!!

A +

tintin a écrit:
> Bonjour,
>
> Pour savoir si une table existe, je teste
> select * from sysobjects where type='U' and name = 'nomtable'
>
> Mais après avoir créé une table temporaire #temp, la requête :
> select * from sysobjects where type='U' and name = '#temp'
>
> ne retourne rien, en restant bien sûr dans la même connexion.
>
> Y-a-il un autre moyen de savoir si la table temporaire existe ?
>
> Merci de votre aide !
>
>

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************




Avatar
tintin
Le problème est que si je fais, pour simplifier :

create table #DIRECTORY ( test int )
SELECT name FROM sysobjects WHERE id = OBJECT_ID('#DIRECTORY')

la seconde instruction ne me retourne rien.

A fortiori, bien sûr, la requête complète que tu suggères ne marchera pas.

Par contre cela marche bien avec une table permanente (sans #).

Que se passe-t-il ?

Merci de ton aide.


"Fred BROUARD" a écrit :

-- teste l'existance d'une table temporaire locale
-- de nom #DIRECTORY pour la virer
IF EXISTS (SELECT *
FROM tempdb.INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = 'tempdb'
AND TABLE_SCHEMA = USER
AND TABLE_NAME = (SELECT name
FROM tempdb..sysobjects
WHERE id = OBJECT_ID('tempdb..#DIRECTORY')))
DROP TABLE #DIRECTORY

C'est le seul cas ou il faut passer par l'intermédiaire d'une table système !!!

A +

tintin a écrit:
> Bonjour,
>
> Pour savoir si une table existe, je teste
> select * from sysobjects where type='U' and name = 'nomtable'
>
> Mais après avoir créé une table temporaire #temp, la requête :
> select * from sysobjects where type='U' and name = '#temp'
>
> ne retourne rien, en restant bien sûr dans la même connexion.
>
> Y-a-il un autre moyen de savoir si la table temporaire existe ?
>
> Merci de votre aide !
>
>

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************




Avatar
bruno reiter [MVP]
create table #t1(c1 int null)


if (object_id(N'tempdb..#t1') is not null)
begin
print 'exists and dropped #t1'
drop table #t1
end
else
begin
print 'does not exists'
end

attention, il pourrait exister une PROC #t1


br

"tintin" wrote in message
news:
Bonjour,

Pour savoir si une table existe, je teste
select * from sysobjects where type='U' and name = 'nomtable'

Mais après avoir créé une table temporaire #temp, la requête :
select * from sysobjects where type='U' and name = '#temp'

ne retourne rien, en restant bien sûr dans la même connexion.

Y-a-il un autre moyen de savoir si la table temporaire existe ?

Merci de votre aide !




Avatar
tintin
Désolé je n'avais pas compris l'usage de tempdb, et croyais que c'était ta
base de tests. Donc tout va bien.

"tintin" a écrit :

Le problème est que si je fais, pour simplifier :

create table #DIRECTORY ( test int )
SELECT name FROM sysobjects WHERE id = OBJECT_ID('#DIRECTORY')

la seconde instruction ne me retourne rien.

A fortiori, bien sûr, la requête complète que tu suggères ne marchera pas.

Par contre cela marche bien avec une table permanente (sans #).

Que se passe-t-il ?

Merci de ton aide.


"Fred BROUARD" a écrit :

> -- teste l'existance d'une table temporaire locale
> -- de nom #DIRECTORY pour la virer
> IF EXISTS (SELECT *
> FROM tempdb.INFORMATION_SCHEMA.TABLES
> WHERE TABLE_CATALOG = 'tempdb'
> AND TABLE_SCHEMA = USER
> AND TABLE_NAME = (SELECT name
> FROM tempdb..sysobjects
> WHERE id = OBJECT_ID('tempdb..#DIRECTORY')))
> DROP TABLE #DIRECTORY
>
> C'est le seul cas ou il faut passer par l'intermédiaire d'une table système !!!
>
> A +
>
> tintin a écrit:
> > Bonjour,
> >
> > Pour savoir si une table existe, je teste
> > select * from sysobjects where type='U' and name = 'nomtable'
> >
> > Mais après avoir créé une table temporaire #temp, la requête :
> > select * from sysobjects where type='U' and name = '#temp'
> >
> > ne retourne rien, en restant bien sûr dans la même connexion.
> >
> > Y-a-il un autre moyen de savoir si la table temporaire existe ?
> >
> > Merci de votre aide !
> >
> >
>
> --
> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
> ********************* http://www.datasapiens.com ***********************
>
>