Présentation

 
Bonjour,

freelance, administrateur de base de données et expert sur la plateforme SQL Server, j'interviens auprès de PME ou de Grands Comptes pour auditer leurs serveurs et en améliorer performances, robustesse et sécurité.

Vous pouvez faire appel à mes services pour des missions ponctuelles ou des projets plus longs.

Pascal MESSAGER
mail messager(point)pascal(point).pro(arobase)wanadoo(point)fr
06-63-94-56-97


Navigation

Page d'accueil

Présentation et contact : CV  

Une méthode remarquable : Audit SQL

Liens suggérés :

Un Séminaire de haut niveau http://www.sqlpass.org

Script pour "trous de date en SQL 2005"

 

/* Recherche de trous de date */
/* -------------------------- */
 /*
 copyright Pascal MESSAGER 2008 - DBA SQL Server 
 messager.pascal.pro@wanadoo.fr 06-63-94-56-97
 dba-sqlserver.over-blog.com
 */

 /* Nettoyage */
 /* --------- */

  drop table #date_pref
  drop table #comptage
  drop table ##pivcompt
  drop table #calendrier

  set nocount on
  set QUOTED_IDENTIFIER ON

 /* Liste des tables concernées */
 /* --------------------------- */

  --select * from sys.tables
  select top 1000 o.name, max(rows) rows
  from sysindexes i
  join sysobjects o on o.id = i.id
  where o.name not like 'sys%'
  group by o.name
  order by 2 desc


 /* Sélection de la colonne date */
 /* ---------------------------- */

  select t.name nomtable, c.name nomcolonne, c.column_id, i.index_id, i.name nomindex,  isnull(key_ordinal, 255) ordreindex
  into #date_pref
  from sys.tables t
  join sys.columns c on c.object_id = t.object_id
  join sys.types y on y.system_type_id = c.system_type_id
  left outer join sys.index_columns ic on ic.object_id = t.object_id and ic.column_id = c.column_id
  left outer join sys.indexes i on i.object_id = t.object_id and i.index_id = ic.index_id -- and i.column_id = ic.column_id
  where c.system_type_id in (58,61)
   and t.name not like 'sys%'
--   and t.name not like '% %' -- !!
   and t.name not like '%tampon' -- !!

  order by t.name, ordreindex, c.column_id

  -- Affichage pour contrôle
  /*
  select a.nomtable, A.nomcolonne, min(A.ordreindex) ordreindex
  from #date_pref a
  where A.nomcolonne = (select top 1 nomcolonne from #date_pref B where B.nomtable = A.nomtable order by ordreindex, column_id)
  group by a.nomtable, A.nomcolonne
  order by a.nomtable
  */

 /* Table de comptages */
 /* ------------------ */

  create table #comptage
  (jour smalldatetime
  , nomtable sysname
  , nbenreg int
  )

 /* Requête à générer */
 /* ----------------- */
  /*
  select @req =
    'insert into #comptage select dateadd(dd,0, datediff(dd,0,' + quotename(@nomcolonne) + '))'
  + ', ''' + @nomtable + ''', count(*) from '  + quotename(@nomtable)
  + ' group by dateadd(dd,0, datediff(dd,0,' + quotename(@nomcolonne) + ')) '
  */

 /* Boucle par curseur */
 /* ------------------ */

  declare @nomtable sysname, @nomcolonne sysname, @ordreindex tinyint

  declare @i smallint
  declare @req nvarchar(1000)
  declare @listepivot nvarchar(1000)
  set @i = 0
  set @listepivot = ''
  set @i = 0

  declare cpt_cur cursor   
  for
   select a.nomtable, A.nomcolonne, min(A.ordreindex) ordreindex
   from #date_pref a
   where A.nomcolonne = (select top 1 nomcolonne from #date_pref B where B.nomtable = A.nomtable order by ordreindex, column_id)
   group by a.nomtable, A.nomcolonne
   order by a.nomtable

  open cpt_cur
  fetch next from cpt_cur
  into @nomtable, @nomcolonne, @ordreindex

  WHILE @@FETCH_STATUS = 0
  begin
   -- comptage par group by
   select @req = 'insert into #comptage select dateadd(dd,0, datediff(dd,0,' + quotename(@nomcolonne) + '))'
    + ', ''' + @nomtable + ''', count(*) from '  + quotename(@nomtable)
    + ' group by dateadd(dd,0, datediff(dd,0,' + quotename(@nomcolonne) + ')) '
   print @req
   exec (@req)
   -- Construit la liste pour le pivot
   set @listepivot =  @listepivot + case when @i = 0 then '' else ', ' end + '"' + @nomtable + '"'
   set @i = @i + 1
   -- Suivant
   fetch next from cpt_cur
   into @nomtable, @nomcolonne, @ordreindex
  end
  close cpt_cur
  deallocate cpt_cur

  -- select * from #comptage
  print @listepivot

 /* Pivotage auto */
 /* ------------- */

  -- drop table ##pivcompt
  
  select @req =
  'select jour,
  ' + @listepivot
  + '
   into ##pivcompt from #comptage

   pivot ( sum(#comptage.nbenreg) for nomtable in ( '
  + @listepivot
  + ' 
  )) as p order by jour desc '
  print @req
  exec (@req)

  -- select * from ##pivcompt

 /* Table calendrier */
 /* ---------------- */

  -- drop table #calendrier
  create table #calendrier (jour smalldatetime)
  declare @deb smalldatetime 
  declare @fin smalldatetime 
  select @deb = min(jour), @fin = max(jour)  from #comptage

  declare @d smalldatetime
  set @d = @deb
  while @d <= @fin
  begin
   insert into #calendrier (jour) values ( @d )
   set @d = dateadd(day, 1, @d)
  end

  -- select * from #calendrier

 /* Final avec trous */
 /* ---------------- */
  
  select #calendrier.jour, datepart(dw, #calendrier.jour) joursemaine , ##pivcompt.*
  from #calendrier
  left outer join ##pivcompt on ##pivcompt.jour = #calendrier.jour
  order by #calendrier.jour desc


-- Fin

Blog : Actualité sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur avec TF1 Network - Signaler un abus