lunes, 15 de febrero de 2016

¿Donde tocamos el campo...? en sqlServer


Cada cierto tiempo me veo en la necesidad de ver en que partes se hace uso de un cierto campo, o tabla, ... para ver el impacto de algunas modificaciones. Se que hay herramientas para esto, sqlsearch es buena, pero muchas veces me es mas rápido usar el script que preparé hace un tiempo.
USE  BBDD

declare @sbus1 varchar (200)
declare @sbus2 varchar (200)
set @sbus1  =  'cadenaBuscada'
set @sbus2  =  @sbus1

select distinct o.name
    , o.xtype 
    , case o.type 
    when 'AF' then 'Función de agregado (CLR)'
    when 'C' then 'Restricción CHECK'
    when 'D' then 'Valor predeterminado o restricción DEFAULT'
    when 'F' then 'Restricción FOREIGN KEY'
    when 'L' then 'Registro'
    when 'FN' then 'Función escalar'
    when 'FS' then 'Función escalar del ensamblado (CLR)'
    when 'FT' then 'Función con valores de tabla de ensamblado (CLR)'
    when 'IF' then 'Función de tabla en línea'
    when 'IT' then 'Tabla interna'
    when 'P' then 'Procedimiento almacenado'
    when 'PC' then 'Procedimiento almacenado del ensamblado (CLR)'
    when 'PK' then 'Restricción PRIMARY KEY (type es K)'
    when 'RF' then 'Procedimiento almacenado de filtro de replicación'
    when 'S' then 'Tabla del sistema'
    when 'SN' then 'Sinónimo'
    when 'SQ' then 'Cola de servicio'
    when 'TA' then 'Desencadenador DML del ensamblado (CLR)'
    when 'TF' then 'Función de tabla'
    when 'TR' then 'Desencadenador DML de SQL'
    when 'TT' then 'Tipo de tabla'
    when 'U' then 'Tabla de usuario'
    when 'UQ' then 'Restricción UNIQUE (type es K)'
    when 'V' then 'Vista'
    when 'X' then 'Procedimiento almacenado extendido '
  end as Tipo
from syscomments c
 inner join sysobjects o  on o.id=c.id
 where (charindex( @sbus1,text)>0 or charindex( @sbus2,text)>0)  
and o.name <> @sbus1  and o.name <> @sbus2  
order by tipo  
 
El objetivo de estos post son para no olvidar donde deje los "dichosos" scripts, por lo que al final será como un cajón de sastre para mis necesidades puntuales. De todos modos si veis algo mal, algo mejorable, etc... no dudéis en comentarlo.

Bloqueos SQLServer ¿quien me bloquea? sp_who2


De vez en cuando tengo la necesidad de ver quien me ha bloqueado algún proceso y al ejecutar sp_who2 'Active' me da demasiada información que no necesito. Hace tiempo hice un script que me limita la información solo a lo que se refiere a los procesos bloqueados.

De algún lugar de la red cogí scripts similares y adapté a mis necesidades por lo que si a alguien le hace falta o le interesa que lo coja sin dudar.
IF NOT OBJECT_ID('tempdb.dbo.#sp_who2') IS NULL  
DROP TABLE dbo.#sp_who2  
  
CREATE TABLE #sp_who2  
    (SPID INT,   
    Status VARCHAR(1000) NULL,   
    Login SYSNAME NULL,   
    HostName SYSNAME NULL,   
    BlkBy SYSNAME NULL,   
    DBName SYSNAME NULL,   
    Command VARCHAR(1000) NULL,   
    CPUTime INT NULL,   
    DiskIO INT NULL,   
    LastBatch VARCHAR(1000) NULL,   
    ProgramName VARCHAR(1000) NULL,   
    SPID2 INT,  
    REQUESTID INT)   
GO  
-- Inserto los valores  
 INSERT INTO #sp_who2  
 EXEC sp_who2  
GO  

-- Seleccion de valores    
SELECT blkby  
into #bloqueadoresBloqueados
FROM #sp_who2
where ltrim(rtrim(replace(blkby,'.',''))) <> '' -- bloqueados
union
SELECT spid  
FROM #sp_who2
where ltrim(rtrim(replace(blkby,'.',''))) <> '' -- bloqueados

select *
from #sp_who2
where SPID in (select * from #bloqueadoresBloqueados)

drop table #bloqueadoresBloqueados

GO  
-- Borrado temporal (para no dejar cargada)
DROP TABLE #sp_who2  
GO  

El objetivo de estos post son para no olvidar donde deje los "dichosos" scripts, por lo que al final será como un cajón de sastre para mis necesidades puntuales. De todos modos si veis algo mal, algo mejorable, etc... no dudéis en comentarlo.