Procédure stockée et parametre "base donnée"

Procédure stockée et parametre "base donnée" - SQL/NoSQL - Programmation

Marsh Posté le 11-03-2005 à 09:55:22    

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 :
  1. SET QUOTED_IDENTIFIER OFF
  2. GO
  3. SET ANSI_NULLS OFF
  4. GO
  5. ALTER  PROCEDURE dbo.ColoReindex @dbname sysname AS
  6. IF ((@dbname is null OR datalength(@dbname) = 0))
  7. begin
  8. raiserror (15004,-1,-1)
  9. return (1)
  10. end
  11. if not exists (select * from master.dbo.sysdatabases where name = @dbname)
  12. begin
  13. raiserror(15010,-1,-1,@dbname)
  14. return (1)
  15. end
  16. --count records in Travail.dbo.Index_Log where Complete=0
  17. if (Select count(pkIndex_Log) as Ind_Count from Travail.dbo.Index_Log where Complete=0 and Run_Type='Indexing') = 0
  18. Begin
  19. -----START INSERT-----
  20. DECLARE @Cur_Run int
  21. SET @Cur_Run=(select isnull(max(Run_No),0) + 1 from Travail.dbo.Index_Log)

Le probleme est la

Code :
  1. DECLARE @TableName sysname
  2. DECLARE cur_reindex CURSOR FOR
  3. SELECT TABLE_NAME
  4. FROM INFORMATION_SCHEMA.TABLES -- Je voudrais passer mon nom de base ici
  5. OPEN cur_reindex
  6. FETCH NEXT FROM cur_reindex INTO @TableName

Fin du probleme

Code :
  1. WHILE @@FETCH_STATUS = 0
  2. BEGIN
  3. DECLARE @IndexName sysname
  4. DECLARE cur_reindexA CURSOR FOR
  5. SELECT i.name as index_name
  6. FROM dbo.sysindexes i
  7. WHERE id = object_id(@TableName) and i.indid > 0 and i.indid < 255
  8. and (indexkey_property(object_id(@TableName), i.indid, 1, N'isdescending') is not null)
  9. and (i.name is not null) and dpages>0
  10. OPEN cur_reindexA
  11. FETCH NEXT FROM cur_reindexA INTO @IndexName
  12. WHILE @@FETCH_STATUS = 0
  13. BEGIN
  14. insert into Travail.dbo.Index_Log (Complete, Table_Name, Index_Name, Run_No,Run_Type) values(0, @TableName, @IndexName, @Cur_Run, 'Indexing')
  15. FETCH NEXT FROM cur_reindexA INTO @IndexName
  16. END
  17. CLOSE cur_reindexA
  18. DEALLOCATE cur_reindexA
  19. FETCH NEXT FROM cur_reindex INTO @TableName
  20. END
  21. CLOSE cur_reindex
  22. DEALLOCATE cur_reindex
  23. -----END INSERT-----
  24. End
  25. ----------------------------------END Insert table values------------------
  26. DECLARE @doTableName varchar(75), @doIndexName varchar(75), @dopkIndex_Log int
  27. DECLARE cur_doindex CURSOR FOR
  28. select Table_Name, Index_Name, pkIndex_Log from Travail.dbo.Index_Log where Complete=0 and Run_Type='Indexing'
  29. OPEN cur_doindex
  30. FETCH NEXT FROM cur_doindex INTO @doTableName, @doIndexName, @dopkIndex_Log
  31. WHILE @@FETCH_STATUS = 0
  32. BEGIN
  33. update Travail.dbo.Index_Log set Start_Date=getDate() where pkIndex_Log=@dopkIndex_Log
  34. --DBCC DBREINDEX (@doTableName, @doIndexName, 0, sorted_data_reorg)
  35. update Travail.dbo.Index_Log set End_Date=getDate(), Run_Type='Indexed',Complete=1 where pkIndex_Log=@dopkIndex_Log
  36. FETCH NEXT FROM cur_doindex INTO @doTableName, @doIndexName, @dopkIndex_Log
  37. END
  38. CLOSE cur_doindex
  39. DEALLOCATE cur_doindex
  40. GO
  41. SET QUOTED_IDENTIFIER OFF
  42. GO
  43. SET ANSI_NULLS ON
  44. GO


Message édité par orlith le 11-03-2005 à 10:44:05
Reply

Marsh Posté le 11-03-2005 à 09:55:22   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed