orlith | Bonjour a tous
J'ai trouvé un script sur le net qui permet de reindexer toutes les tables d'une bases donnée.
J'essaye de le transformer en proc stock avec en parametre le nom de la base que je veux toucher.
J'ai un probleme !
On ne peut utiliser un "Use database" dans une proc stock.
On ne peut utiliser une variable @dbname avec l'instruction "SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES" du genre "SELECT TABLE_NAME
FROM @dbname.INFORMATION_SCHEMA.TABLES"
Je ne peux faire un EXEC avec en parametre la commande sql car un EXEC.. ne passe pas dans une ouverture de cursor.
Que faire ? cela doit bien exister ! Comment se positionner sur une base dont le nom est passé en parametre dans une proc stock ?
Merci de votre aide !
Code :
- SET QUOTED_IDENTIFIER OFF
- GO
- SET ANSI_NULLS OFF
- GO
- ALTER PROCEDURE dbo.ColoReindex @dbname sysname AS
- IF ((@dbname is null OR datalength(@dbname) = 0))
- begin
- raiserror (15004,-1,-1)
- return (1)
- end
- if not exists (select * from master.dbo.sysdatabases where name = @dbname)
- begin
- raiserror(15010,-1,-1,@dbname)
- return (1)
- end
- --count records in Travail.dbo.Index_Log where Complete=0
- if (Select count(pkIndex_Log) as Ind_Count from Travail.dbo.Index_Log where Complete=0 and Run_Type='Indexing') = 0
- Begin
- -----START INSERT-----
- DECLARE @Cur_Run int
- SET @Cur_Run=(select isnull(max(Run_No),0) + 1 from Travail.dbo.Index_Log)
|
Le probleme est la Code :
- DECLARE @TableName sysname
- DECLARE cur_reindex CURSOR FOR
- SELECT TABLE_NAME
- FROM INFORMATION_SCHEMA.TABLES -- Je voudrais passer mon nom de base ici
- OPEN cur_reindex
- FETCH NEXT FROM cur_reindex INTO @TableName
|
Fin du probleme Code :
- WHILE @@FETCH_STATUS = 0
- BEGIN
- DECLARE @IndexName sysname
- DECLARE cur_reindexA CURSOR FOR
- SELECT i.name as index_name
- FROM dbo.sysindexes i
- WHERE id = object_id(@TableName) and i.indid > 0 and i.indid < 255
- and (indexkey_property(object_id(@TableName), i.indid, 1, N'isdescending') is not null)
- and (i.name is not null) and dpages>0
- OPEN cur_reindexA
- FETCH NEXT FROM cur_reindexA INTO @IndexName
- WHILE @@FETCH_STATUS = 0
- BEGIN
- insert into Travail.dbo.Index_Log (Complete, Table_Name, Index_Name, Run_No,Run_Type) values(0, @TableName, @IndexName, @Cur_Run, 'Indexing')
- FETCH NEXT FROM cur_reindexA INTO @IndexName
- END
- CLOSE cur_reindexA
- DEALLOCATE cur_reindexA
- FETCH NEXT FROM cur_reindex INTO @TableName
- END
- CLOSE cur_reindex
- DEALLOCATE cur_reindex
- -----END INSERT-----
- End
- ----------------------------------END Insert table values------------------
- DECLARE @doTableName varchar(75), @doIndexName varchar(75), @dopkIndex_Log int
- DECLARE cur_doindex CURSOR FOR
- select Table_Name, Index_Name, pkIndex_Log from Travail.dbo.Index_Log where Complete=0 and Run_Type='Indexing'
- OPEN cur_doindex
- FETCH NEXT FROM cur_doindex INTO @doTableName, @doIndexName, @dopkIndex_Log
- WHILE @@FETCH_STATUS = 0
- BEGIN
- update Travail.dbo.Index_Log set Start_Date=getDate() where pkIndex_Log=@dopkIndex_Log
- --DBCC DBREINDEX (@doTableName, @doIndexName, 0, sorted_data_reorg)
- update Travail.dbo.Index_Log set End_Date=getDate(), Run_Type='Indexed',Complete=1 where pkIndex_Log=@dopkIndex_Log
- FETCH NEXT FROM cur_doindex INTO @doTableName, @doIndexName, @dopkIndex_Log
- END
- CLOSE cur_doindex
- DEALLOCATE cur_doindex
- GO
- SET QUOTED_IDENTIFIER OFF
- GO
- SET ANSI_NULLS ON
- GO
|
Message édité par orlith le 11-03-2005 à 10:44:05
|