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)
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 ... '
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" <glebarbier@supprimerceci_segilog.com> a écrit dans le message de
news: eQ5rDSSZFHA.2076@TK2MSFTNGP15.phx.gbl...
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 ... '
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 ... '
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
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" <Brigitte@discussions.microsoft.com> a écrit dans le message de
news: 7949A68F-AF68-4DB8-AE1D-D10EA086D5E2@microsoft.com...
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)
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
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 ... '
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 ... '
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 ... '
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 ... '
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" <glebarbier@supprimerceci_segilog.com> a écrit dans le message de
news: ulw1TwaZFHA.2768@tk2msftngp13.phx.gbl...
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 ... '
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 ... '
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
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
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" <Brigitte@discussions.microsoft.com> wrote in message
news:7949A68F-AF68-4DB8-AE1D-D10EA086D5E2@microsoft.com...
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)
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
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'
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 *************************
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'
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 *************************
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 *************************