miércoles, 9 de marzo de 2011

Procedimiento Almacenado para buscar texto en todas las tablas y en todas las columnas

Por medio de este sp se puede buscar una cadena en toda una base, se busca en todas las tablas y en todas las columnas:


exec ToolsSearchAllTablesAllColumns 'Ezequiel'

ColumnName                                             ColumnValue
-----------------------------------------                      ---------------------------------
[dbo].[TABLA_A].[Apellido y Nombre]        Gonzalez, Ezequiel
[dbo].[TABLA_B].[apeynom]                      LIJTINSTENS, EZEQUIEL
[dbo].[TABLA_C].[cysfirdes]                      LEG 98488 AVA EZEQUIEL



CREATE PROC [dbo].[ToolsSearchAllTablesAllColumns]

@SearchStr nvarchar(100)

AS
BEGIN
-- Purpose: To search all columns in all tables for a given search string
-- Written by: Francisco Tapia
-- Site: http://sqlthis.blogspot.com
-- Inspired by: Narayana Vyas Kondreddi http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm
-- Tested on: SQL Server 7.0, 2000 and 2005
-- Date modified: June 23, 2009

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(255), @Parse AS INT

SELECT @TableName = '', @ColumnName = ''
SET @SearchStr = QUOTENAME('%' + @SearchStr + '%','''')

WHILE (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName = (
SELECT MIN(QUOTENAME(C.Table_Schema) + '.' + QUOTENAME(C.Table_name) + '|' + QUOTENAME(C.Column_name))
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.TABLES t on c.table_schema = t.table_schema and c.Table_name = t.table_name
WHERE T.TABLE_TYPE = 'BASE TABLE'
AND C.DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'text', 'ntext')
AND QUOTENAME(C.Table_Schema) + '.' + QUOTENAME(C.Table_name) + '.' + QUOTENAME(COLUMN_NAME) > @TableName + '.' + @ColumnName

)

SET @Parse = PATINDEX ('%|%', @ColumnName)

SET @TableName = SUBSTRING(@ColumnName, 1, @Parse - 1)
SET @ColumnName = SUBSTRING(@ColumnName, @Parse +1, LEN(@ColumnName))

IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', SUBSTRING(' + @ColumnName + ',1, 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr
)
END
END


SELECT ColumnName, ColumnValue FROM #Results
ORDER BY ColumnName


END

GO




miércoles, 2 de marzo de 2011

SQL Función para obtener antiguedad o Seniority

Por medio de esta función pueden obtener la antiguedad , por ejemplo en un trabajo:

Select dbo.ToolSeniority('20090701','20110111')

RESULTADO:

-------------------------
1 Año 6 Meses 10 Días

Usa dos funciones: (que fui encontrando y adaptando a las necesidades puntuales  del formato de salida)


CREATE FUNCTION dbo.DateDiffPoda
(
@type char(2),
        @FromDate DATETIME,
        @ToDate DATETIME
)
RETURNS INT
BEGIN
        RETURN  
   CASE
               WHEN @FromDate > @ToDate THEN NULL --Filtra fecha invertida
ELSE

  Case
  When upper(@type) not in ('YY','MM','DD') THEN NULL  
  WHEN upper(@type)='YY' THEN       --AÑO
CASE 
  WHEN DATEPART(day, @FromDate) > DATEPART(day, @ToDate) THEN DATEDIFF(month, @FromDate, @ToDate) - 1
  ELSE DATEDIFF(month, @FromDate, @ToDate)
END / 12
  WHEN upper(@type)='MM' THEN       --MES
CASE
  WHEN DATEPART(day, @FromDate) > DATEPART(day, @ToDate) THEN DATEDIFF(month, @FromDate, @ToDate) - 1
  ELSE DATEDIFF(month, @FromDate, @ToDate)
END
  WHEN upper(@type)='DD' THEN       --MES
CASE
  WHEN convert(nvarchar,@FromDate,108) > convert(nvarchar,@ToDate,108)  THEN DATEDIFF(dd, @FromDate, @ToDate) - 1
  ELSE DATEDIFF(dd, @FromDate, @ToDate)
END
end

END
END
GO

CREATE function ToolSeniority
(
        @FechaIngreso DATETIME,
        @FechaActual DATETIME
)
RETURNS varchar(25)
--------------------
--Ezequiel Podadera
--22/02/2010
--------------------

Begin
Declare @FechaAñoActual datetime  --Fecha que tiene el mismo año que fecha actual (para calculo interno)
Declare @FechaAñoActualMES datetime --Fecha que tiene el mismo año y mes que fecha actual (para calcular diff días)

Declare @DiffAño int
Declare @DiffMes int 
Declare @DiffDia int 

--set @FechaIngreso=getdate()-1549  DATOS DE PRUEBA
--set @FechaActual=getdate()

SET @DiffAño = dbo.datediffPoda('yy',@FechaIngreso,@FechaActual) 

-- FechaAñoActual se posiciona a fecha sin diff en años, para calcular diff en mes
SET @FechaAñoActual = Dateadd(yy, @DiffAño,@FechaIngreso) 
SET @DiffMes = dbo.datediffPoda('mm',@FechaAñoActual,@FechaActual)

-- FechaAñoActualMes se posiciona a fecha sin diff en años-meses, para calcular diff en días
SET @FechaAñoActualMES = DateADD(mm,@DiffMes,@FechaAñoActual)  
SET @DiffDia = dbo.datediffPoda('dd', @FechaAñoActualMES,@FechaActual)

--Formatea la salida
Declare @sAño varchar(8)
Declare @sMes varchar(9)
Declare @sDia varchar(8)
Declare @sSalida varchar(25)

set @sAño=        case when @DiffAño = 0   then ''
  when @DiffAño = 1   then Cast(@DiffAño as varchar) + ' Año '
  when @DiffAño > 1   then Cast(@DiffAño as varchar) + ' Años '
end

set @sMes=        case when @DiffMes = 0   then ''
  when @DiffMes = 1   then Cast(@DiffMes as varchar) + ' Mes '
  when @DiffMes > 1   then Cast(@DiffMes as varchar) + ' Meses '
end

set @sDia=      case when @DiffDia = 0   then ''
  when @DiffDia = 1   then Cast(@DiffDia as varchar) + ' Día '
  when @DiffDia > 1   then Cast(@DiffDia as varchar) + ' Días '
end
set @sSalida= Case when @sAño + @sMes + @sDia ='' then 'Sin Antiguedad' else @sAño + @sMes + @sDia end

Return @sSalida
END

GO

miércoles, 15 de diciembre de 2010

paginacion sql

Un sp que devuelve el resultado de la consulta paginado:


--Tener en cuenta que la primer página es la cero (@PageNumber=0)
CREATE PROCEDURE dbo.EmpleadosMailPaginados
@PageSize int,
@PageNumber int
AS
BEGIN
    SELECT empleg, empemail
    FROM (
        SELECT empleg, empemail,
        ROW_NUMBER() OVER (ORDER BY empleg) AS RowNumber
        FROM empleado
    )  T
    WHERE RowNumber BETWEEN (@PageSize * @PageNumber) + 1 AND @PageSize * (@PageNumber + 1)
END

viernes, 10 de diciembre de 2010