Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

utilisation du Use +variable

3 réponses
Avatar
laetitia
Bonjour,

Je suis en train de créer une procédure stockée qui va réindexer une base
placée en paramètre : exec sp_reindexBase 'maBase'

Dans un premier temps, je récupère la liste des tables de 'maBase' dans un
cursor. pour chaque table je lance la commande : DBCC DBREINDEX(@TableName,'
',100)
Le problème c'est que la procédure s'exécute par défaut sur master. Il ne
trouve donc pas les tables et retourne une erreur.

Quand j'ajoute "USE maBase" au début de ma procédure ça marche. Seulement le
nom de la base est une variable et Use @DatabaseName ne fonctionne pas.

Comment je peux faire pour forcer le DBCC DBREINDEX sur la base placée en
argument ?

Merci par avance
Laetitia

3 réponses

Avatar
Romelard Fabrice [MVP]
Bonsoir,

Tu peux t'inspirer de ce script-ci qui fait une mise à jour des statistiques
de chaque base du serveur SQL.
- http://www.sqlfr.com/code.aspx?ID)623

--
Cordialement.
Romelard Fabrice [MVP]

"laetitia" a écrit dans le message de
news:
Bonjour,

Je suis en train de créer une procédure stockée qui va réindexer une base
placée en paramètre : exec sp_reindexBase 'maBase'

Dans un premier temps, je récupère la liste des tables de 'maBase' dans un
cursor. pour chaque table je lance la commande : DBCC
DBREINDEX(@TableName,'
',100)
Le problème c'est que la procédure s'exécute par défaut sur master. Il ne
trouve donc pas les tables et retourne une erreur.

Quand j'ajoute "USE maBase" au début de ma procédure ça marche. Seulement
le
nom de la base est une variable et Use @DatabaseName ne fonctionne pas.

Comment je peux faire pour forcer le DBCC DBREINDEX sur la base placée en
argument ?

Merci par avance
Laetitia


Avatar
Romelard Fabrice [MVP]
Bonsoir,

Cette demande m'a intrigué, j'ai donc cherché comment faire ceci, voila une
possibilité :
-------

DECLARE @name sysname
DECLARE @nameTable sysname
DECLARE @LaRequette varchar(8000)
DECLARE @DateJour varchar(20)

SET @DateJour = REPLACE(CONVERT(VARCHAR, GetDate(), 102), '.', '_')
PRINT
'---------------------------------------------------------------------'
PRINT ' DATE DE LA MISE A JOUR DES STATISTIQUES LANCEE : '+ @DateJour
PRINT
'---------------------------------------------------------------------'

DECLARE TESTCURSEUR CURSOR
FOR SELECT Master.dbo.sysdatabases.name FROM Master.dbo.sysdatabases
WHERE Master.dbo.sysdatabases.name NOT IN ('tempdb', 'model', 'pubs')

OPEN TESTCURSEUR
FETCH NEXT FROM TESTCURSEUR
INTO @name

WHILE @@FETCH_STATUS = 0

BEGIN
PRINT ''
PRINT
'---------------------------------------------------------------------'
PRINT ' RECONSTRUCTION DES INDEXES DE LA BASE : '+ @name
PRINT
'---------------------------------------------------------------------'

SET @LaRequette = 'SELECT U.name +''.''+ O.name AS name
FROM '+ @name +'.dbo.sysobjects O INNER JOIN '+ @name +'.dbo.sysusers U
ON O.uid = U.uid WHERE O.xtype= ''U'';'

PRINT 'Changement de base : '+ @LaRequette
PRINT
'---------------------------------------------------------------------'

EXEC('DECLARE TESTCURSEURTABLE CURSOR FOR '+ @LaRequette)
OPEN TESTCURSEURTABLE
FETCH NEXT FROM TESTCURSEURTABLE
INTO @nameTable

WHILE @@FETCH_STATUS = 0
BEGIN
SET @LaRequette = 'DBCC DBREINDEX ('''+ @name +'.'+ @nameTable +''', '''',
100)'
PRINT 'Requette : '+ @LaRequette
EXECUTE (@LaRequette)
PRINT
'---------------------------------------------------------------------'
FETCH NEXT FROM TESTCURSEURTABLE
INTO @nameTable
END

CLOSE TESTCURSEURTABLE
DEALLOCATE TESTCURSEURTABLE

FETCH NEXT FROM TESTCURSEUR
INTO @name
END

PRINT
'---------------------------------------------------------------------'
PRINT ' FIN DE LA RECONSTRUCTION'
PRINT
'---------------------------------------------------------------------'

CLOSE TESTCURSEUR
DEALLOCATE TESTCURSEUR
GO

-------
Cordialement.

Romelard Fabrice [MVP]

"laetitia" a écrit dans le message de
news:
Bonjour,

Je suis en train de créer une procédure stockée qui va réindexer une base
placée en paramètre : exec sp_reindexBase 'maBase'

Dans un premier temps, je récupère la liste des tables de 'maBase' dans un
cursor. pour chaque table je lance la commande : DBCC
DBREINDEX(@TableName,'
',100)
Le problème c'est que la procédure s'exécute par défaut sur master. Il ne
trouve donc pas les tables et retourne une erreur.

Quand j'ajoute "USE maBase" au début de ma procédure ça marche. Seulement
le
nom de la base est une variable et Use @DatabaseName ne fonctionne pas.

Comment je peux faire pour forcer le DBCC DBREINDEX sur la base placée en
argument ?

Merci par avance
Laetitia


Avatar
Romelard Fabrice [MVP]
Vous trouverez d'ailleurs cette source :
- http://www.sqlfr.com/code.aspx?ID5836

Fabrice

"laetitia" a écrit dans le message de
news:
Bonjour,

Je suis en train de créer une procédure stockée qui va réindexer une base
placée en paramètre : exec sp_reindexBase 'maBase'

Dans un premier temps, je récupère la liste des tables de 'maBase' dans un
cursor. pour chaque table je lance la commande : DBCC
DBREINDEX(@TableName,'
',100)
Le problème c'est que la procédure s'exécute par défaut sur master. Il ne
trouve donc pas les tables et retourne une erreur.

Quand j'ajoute "USE maBase" au début de ma procédure ça marche. Seulement
le
nom de la base est une variable et Use @DatabaseName ne fonctionne pas.

Comment je peux faire pour forcer le DBCC DBREINDEX sur la base placée en
argument ?

Merci par avance
Laetitia