OVH Cloud OVH Cloud

Problème avec un curseur.

8 réponses
Avatar
Brigitte
Bonjour,

Je souhaite exécuter la commande update statistics sur un ensemble de table.
Pour cela, j'utilise un curseur.
Mais la commande d'update ne marche donc pas.
Auriez-vous une idée?
Merci
Brigitte :

Declare objet CURSOR for
select distinct O.NAME FROM SYSOBJECTS O JOIN SYSINDEXES i ON o.id = i.id
WHERE i.rowmodctr > 0 and o.xtype = 'U'
OPEN objet
FETCH NEXT FROM objet into @qry
--WHILE @@FETCH_STATUS = 0
SET @qry1 = ('Use '+ @dbName+SPACE(1)+'UPDATE STATISTICS '+ @qry)

exec (@qry1)
CLOSE objet
DEALLOCATE objet

End

8 réponses

Avatar
Gilles
Bonjour Brigitte

SET @qry1 = ('Use '+ @dbName+SPACE(1)+'UPDATE STATISTICS '+ @qry)



Peut être séparer la commande USE du update
SET @qry1 = 'Use '+ @dbName
EXEC @qry1
SET @qry1 ='UPDATE STATISTICS '+ @qry

EXEC @qry1

Ou si tu utilise des tables toujours noté tes tables @dbName +
'.dbo.matable ... '

Style

SET @qry1 ='UPDATE STATISTICS '+ @dbName + '.dbo.' + @qry
EXEC @qry1

A tester !!
Gilles
Avatar
Jean-Nicolas BERGER
Certainement pas !
Extrait de l'aide en ligne T-SQL :

Les modifications du contexte de la base de données ne durent que jusqu'à la
fin de l'instruction EXECUTE. Dans l'exemple suivant, le contexte de la base
de données, après l'instruction EXEC, est master :
USE master EXEC ("USE pubs") SELECT * FROM authors

JN.

"Gilles" a écrit dans le message de
news:
Bonjour Brigitte

SET @qry1 = ('Use '+ @dbName+SPACE(1)+'UPDATE STATISTICS '+ @qry)



Peut être séparer la commande USE du update
SET @qry1 = 'Use '+ @dbName
EXEC @qry1
SET @qry1 ='UPDATE STATISTICS '+ @qry

EXEC @qry1

Ou si tu utilise des tables toujours noté tes tables @dbName +
'.dbo.matable ... '

Style

SET @qry1 ='UPDATE STATISTICS '+ @dbName + '.dbo.' + @qry
EXEC @qry1

A tester !!
Gilles






Avatar
Jean-Nicolas BERGER
Revoyez la structure du parcours des enregistrements du curseur.
Extrait de la doc en ligne :


DECLARE titles_cursor CURSOR FOR
SELECT t.title
FROM titleauthor ta, titles t
WHERE ta.title_id = t.title_id AND
ta.au_id = @au_id -- Variable value from the outer cursor

OPEN titles_cursor
FETCH NEXT FROM titles_cursor INTO @title

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT @message = " " + @title
PRINT @message
FETCH NEXT FROM titles_cursor INTO @title

END

CLOSE titles_cursor
DEALLOCATE titles_cursor


Il ne faut donc pas mettre de CLOSE ni de DEALLOCATE avant le END, enlever
les commentaires devant le WHILE, et surtout de pas oublier le FETCH NEXT
avant le END, sinon ça boucle...

JN.


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

Je souhaite exécuter la commande update statistics sur un ensemble de
table.
Pour cela, j'utilise un curseur.
Mais la commande d'update ne marche donc pas.
Auriez-vous une idée?
Merci
Brigitte :

Declare objet CURSOR for
select distinct O.NAME FROM SYSOBJECTS O JOIN SYSINDEXES i ON o.id = i.id
WHERE i.rowmodctr > 0 and o.xtype = 'U'
OPEN objet
FETCH NEXT FROM objet into @qry
--WHILE @@FETCH_STATUS = 0
SET @qry1 = ('Use '+ @dbName+SPACE(1)+'UPDATE STATISTICS '+ @qry)

exec (@qry1)
CLOSE objet
DEALLOCATE objet

End



Avatar
Gilles
Bonjour JN,

Les modifications du contexte de la base de données ne durent que jusqu'à
la fin de l'instruction EXECUTE. Dans l'exemple suivant, le contexte de la
base de données, après l'instruction EXEC, est master :
USE master EXEC ("USE pubs") SELECT * FROM authors



OK pour l'info

Ou si tu utilise des tables toujours noté tes tables @dbName +
'.dbo.matable ... '

Style

SET @qry1 ='UPDATE STATISTICS '+ @dbName + '.dbo.' + @qry
EXEC @qry1






Et cette commande ???

Gilles qui n'utilise pas les statistics :-)
Avatar
Jean-Nicolas BERGER
En creusant le pourquoi et le comment, on remarque au passage que SYSOBJECTS
est une table présente dans chaque base, et donc le USE ... ne sert à rien,
puisqu'on ne travaille que dans la base courante...
JN.


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

Les modifications du contexte de la base de données ne durent que jusqu'à
la fin de l'instruction EXECUTE. Dans l'exemple suivant, le contexte de
la base de données, après l'instruction EXEC, est master :
USE master EXEC ("USE pubs") SELECT * FROM authors



OK pour l'info

Ou si tu utilise des tables toujours noté tes tables @dbName +
'.dbo.matable ... '

Style

SET @qry1 ='UPDATE STATISTICS '+ @dbName + '.dbo.' + @qry
EXEC @qry1






Et cette commande ???

Gilles qui n'utilise pas les statistics :-)




Avatar
Gilles
Bonne remarque,

on recherche les tables d'une base pour mettre les statistiques de cette
table dans une autre base !!!!

:-)

il y a comme un soucis

Gilles
Avatar
Chris V.
Ne serait pas un probleme de SQL Dynamic ?

Pas sur que UPDATE STATISTICS apprecie de se voir passer une variable...
A verifier cependant.

--
______________________________________________
It's still better that if it would have been worst, isn't it ?
C'est toujours mieux que si c'etait pire !
"Brigitte" wrote in message
news:
Bonjour,

Je souhaite exécuter la commande update statistics sur un ensemble de


table.
Pour cela, j'utilise un curseur.
Mais la commande d'update ne marche donc pas.
Auriez-vous une idée?
Merci
Brigitte :

Declare objet CURSOR for
select distinct O.NAME FROM SYSOBJECTS O JOIN SYSINDEXES i ON o.id = i.id
WHERE i.rowmodctr > 0 and o.xtype = 'U'
OPEN objet
FETCH NEXT FROM objet into @qry
--WHILE @@FETCH_STATUS = 0
SET @qry1 = ('Use '+ @dbName+SPACE(1)+'UPDATE STATISTICS '+ @qry)

exec (@qry1)
CLOSE objet
DEALLOCATE objet

End



Avatar
Fred BROUARD
Voici le coeur de ta SP rectifié :

******************************************

DECLARE objet CURSOR
for
SELECT distinct o.name
FROM sysobjects o
JOIN sysindexes i
ON o.id = i.id
WHERE i.rowmodctr > 0
AND o.xtype = 'U'

OPEN objet

DECLARE @tblname NVARCHAR(128)
DECLARE @qry NVARCHAR(2000)

FETCH NEXT FROM objet into @tblname

WHILE @@FETCH_STATUS = 0
BEGIN
SET @qry = ('UPDATE STATISTICS '+ @tblname)
EXEC (@qry1)
FETCH NEXT FROM objet into @tblname
END

CLOSE objet

DEALLOCATE objet

******************************************

Par curiosité quelle est la collation du serveur ?

A +

Brigitte a écrit:
Bonjour,

Je souhaite exécuter la commande update statistics sur un ensemble de table.
Pour cela, j'utilise un curseur.
Mais la commande d'update ne marche donc pas.
Auriez-vous une idée?
Merci
Brigitte :

Declare objet CURSOR for
select distinct O.NAME FROM SYSOBJECTS O JOIN SYSINDEXES i ON o.id = i.id
WHERE i.rowmodctr > 0 and o.xtype = 'U'
OPEN objet
FETCH NEXT FROM objet into @qry
--WHILE @@FETCH_STATUS = 0
SET @qry1 = ('Use '+ @dbName+SPACE(1)+'UPDATE STATISTICS '+ @qry)

exec (@qry1)
CLOSE objet
DEALLOCATE objet

End




--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************