Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Procedimientos Utiles !!! (https://www.clubdelphi.com/foros/showthread.php?t=22040)

Xianto 04-06-2005 20:13:13

Procedimientos Utiles !!!
 
He aquí un listado de procedimientos que en los ultimos años he hecho para mi trabajo y me han sido muy útiles...

Tal vez alguno pueda usarlos o poner más !!!

Reindexar todas las tablas de una db, esto es muy distinto a como lo hace el mantenimiento del MSSQL, quedan mucho mejor...
Código:

 
 CREATE PROCEDURE xreindex AS
        SET NOCOUNT ON
        DECLARE @Table char(100)
        DECLARE IndexCursor CURSOR FOR SELECT name FROM sysobjects WHERE type='U'
        OPEN IndexCursor
        FETCH NEXT FROM IndexCursor INTO @Table
        WHILE @@FETCH_STATUS=0 BEGIN
                DBCC DBREINDEX(@Table)
                FETCH NEXT FROM IndexCursor INTO @Table
        END
        CLOSE IndexCursor
        DEALLOCATE IndexCursor
 
GO

Muestra la fragmentación de una tabla a eleccion o todas, muy util para ver si es necesario una reindexacion o desfragmentacion...
Código:

 
 CREATE PROCEDURE xfragmenta
 @Tabla varchar(100)='1021'
AS
 
 IF @Tabla = '1021'
  BEGIN
  PRINT 'Analizando fragmentación de todas las tablas...'
  PRINT '============================================'
  PRINT ' '
  DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES
  END
 ELSE
  BEGIN
  PRINT 'Analizando fragmentación tabla: '+@Tabla
  PRINT '=============================='
  PRINT ' '
  DBCC SHOWCONTIG (@Tabla)
  END
 
GO

Defragmenta las tablas de una db con una fragmentacion superior a 30 puntos o lo que nosotros le digamos
Código:

 

CREATE PROCEDURE xdefrag
 @maxfrag DECIMAL=30.0
AS
 
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr  VARCHAR (255)
DECLARE @objectid  INT
DECLARE @indexid  INT
DECLARE @frag          DECIMAL
 
DECLARE tables CURSOR FOR
  SELECT TABLE_NAME
  FROM INFORMATION_SCHEMA.TABLES
  WHERE TABLE_TYPE = 'BASE TABLE'
 
CREATE TABLE #fraglist (
  ObjectName CHAR (255),
  ObjectId INT,
  IndexName CHAR (255),
  IndexId INT,
  Lvl INT,
  CountPages INT,
  CountRows INT,
  MinRecSize INT,
  MaxRecSize INT,
  AvgRecSize INT,
  ForRecCount INT,
  Extents INT,
  ExtentSwitches INT,
  AvgFreeBytes INT,
  AvgPageDensity INT,
  ScanDensity DECIMAL,
  BestCount INT,
  ActualCount INT,
  LogicalFrag DECIMAL,
  ExtentFrag DECIMAL)
 
OPEN tables
 
FETCH NEXT
  FROM tables
  INTO @tablename
 
WHILE @@FETCH_STATUS = 0
BEGIN
  INSERT INTO #fraglist
  EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
          WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS')
  FETCH NEXT
          FROM tables
          INTO @tablename
END
 
CLOSE tables
DEALLOCATE tables
 
DECLARE indexes CURSOR FOR
  SELECT ObjectName, ObjectId, IndexId, LogicalFrag
  FROM #fraglist
  WHERE LogicalFrag >= @maxfrag
          AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0
 
OPEN indexes
 
FETCH NEXT
  FROM indexes
  INTO @tablename, @objectid, @indexid, @frag
 
WHILE @@FETCH_STATUS = 0
BEGIN
  PRINT 'Ejecutando DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
          ' + RTRIM(@indexid) + ') - fragmentación actual '
          + RTRIM(CONVERT(varchar(15),@frag)) + '%'
  SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
          ' + RTRIM(@indexid) + ')'
  EXEC (@execstr)
 
  FETCH NEXT
          FROM indexes
          INTO @tablename, @objectid, @indexid, @frag
END
 
CLOSE indexes
DEALLOCATE indexes
 
GO

Procedimiento super util, ejecutas: "xbusca_campo '%sales%'" y te dice todas las tablas donde existe este campo, y su correspondiende formato... se pueden poner o no los comodines %.
Código:

CREATE PROCEDURE xbusca_campo
 @campo varchar(50)
AS
 
select so.name as tabla, sy.name as campo,
 case when sy.isnullable=0 then 'NO' else 'SI' end as nulls,
 sy.length tamaño,
 st.name as tipo, sc.text as defecto
 from sysobjects so (nolock)
 inner join syscolumns sy (nolock) on
  so.id=sy.id and so.type='U' and sy.name like @campo
 inner join systypes st (nolock) on
  sy.xusertype=st.xusertype
 left join syscomments sc (nolock) on
  sy.cdefault=sc.id
 order by so.name
GO

Cuando tienes muchos procedimientos y no sabes donde buscar algo, este procedimiento es lo mejor, le pasas como parametro una cadena con o sin comodines (%) y te dice los procedimientos donde esta el texto que buscas.
Código:

CREATE PROCEDURE xbusca_text_proc
 @cadena_buscada varchar(100)
AS
 
set @cadena_buscada='%'+@cadena_buscada+'%'
 
 select distinct so.name from sysobjects so (nolock)
  inner join syscomments sc (nolock) on
  so.id = sc.id and
  so.type='P' and sc.text like @cadena_buscada
 order by so.name
GO

Bue, espero que le sea util a alguien.... Saludetes !!!

marcoszorrilla 04-06-2005 21:54:31

Pues siempre es de agradecer que alguien a instancias propias quiera compartir su código de manera altruista.


Un Saludo y gracias.

Xianto 17-08-2005 10:28:26

Este es para generar el string de creación de una tabla ya existente...
Como ???
Pues, si tengo una tabla en mi DB que se llama Albaranes y en un procedimientos por un motivo X, necesito hacer una tabla temporal con su misma estructura, podemos hacerlo facilmente con este procedimiento que me retorna el string de creación de la tabla, pero de forma temporal #

Código:

 
CREATE PROCEDURE crea_tabla
 @tabla varchar(50),
 @tabli varchar(50)
AS

Declare @id int, @campo varchar(200), @tipo varchar(100), @tamano int, @collation bit, @sql varchar(5000)
Declare @Temporal Table (campo varchar(200), tipo varchar(100), tamano int, collation bit, orden int)
select @id=id from sysobjects (nolock) where name=@tabla
insert into @Temporal
select sc.name, sy.name, sc.length, 1, sc.colid from syscolumns sc (nolock)
 inner join systypes sy (nolock) on
  sc.xtype=sy.xtype and sc.id=@id and sc.collation is null
insert into @Temporal
select sc.name, sy.name, sc.length, 0, sc.colid from syscolumns sc (nolock)
 inner join systypes sy (nolock) on
  sc.xtype=sy.xtype and sc.id=@id and sc.collation is not null
set @sql='Create Table #'+@tabli+' ('
While exists(select top 1 * from @Temporal)
 Begin
  select top 1 @campo=campo, @tipo=tipo, @tamano=tamano, @collation=collation
        from @Temporal order by orden
  if @collation=0
  set @sql=@sql+@campo+' '+@tipo+'('+cast(@tamano as varchar)+'), '
  else 
  set @sql=@sql+@campo+' '+@tipo+', '
 
  delete @Temporal where campo=@campo
 End
set @sql=substring(@sql,1,len(@sql)-1)+')'
select @sql
GO

Entonces, ejecutando algo como:
Código:

crea_tabla 'Original', 'Copia'
Recibo del procedimiento algo asi:

Código:

Create Table #Copia (Cod_Producto varchar(50), Cod_proveedor int,
Cod_Fam_Pro int, Nombre_Producto varchar(100), Descrip_Producto varchar(200)
, Fec_Alta datetime, Estado bit, Cod_EAN varchar(20),
Cod_Pro_proveedor varchar(20), cod_proveedor0 int, cod_producto0 varchar(50)
, tipo varchar(50), filler varchar(100), gramos int, unidades float,
coste_material float, coste_produccion float, iva float)

Bue, espero les sirva de algo... jejeje


La franja horaria es GMT +2. Ahora son las 19:05:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi