A veces se necesita buscar un valor específico dentro de una base de datos, no importando si son 1000 tablas y 100 campos en cada una. Así que buscando un poco por la red encontré este procedimiento y funciona a la perfección:

 

CREATE PROC SearchAllTables
(
    @SearchStr nvarchar(100)
)
AS
BEGIN

-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi

DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName =
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )

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

SELECT ColumnName, ColumnValue FROM @Results
END

Espero sea de ayuda

 

saludos

Se me presentó un problema al momento de importar un SSIS en SQL 2008, la verdad no sabía a que se debía dado que en mi equipo funcionaba perfectamente pero al instalarlo en un servidor no funcionó el Import SSIS.

El error mostrado era el siguiente

Catastrophic failure

Catastrophic failure

Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) (Microsoft.SqlServer.DTSRuntimeWrap)

Continue reading

Una práctica no recomendable pero a veces necesaria es la de eliminar todos los stored procedures de nuestra base de datos,  navegando por ahí encontré varias opciones pero esta es la que me pareció más adecuada.

DECLARE @procName VARCHAR(500)

DECLARE cur CURSOR

FOR SELECT [name] FROM sys.objects WHERE TYPE = ‘p’
OPEN cur
FETCH NEXT FROM cur INTO @procName
WHILE @@fetch_status = 0
BEGIN
EXEC(‘drop procedure ‘ + @procName)
FETCH NEXT FROM cur INTO @procName
END
CLOSE cur
DEALLOCATE cur

Espero les sea de utilidad

saludos

p.d. el artículo original está aquí

Para obtener el primer día del mes anterior a través de un query debemos escribir

SELECT CONVERT(VARCHAR(10),LTRIM(RTRIM(STR(DATEPART(YYYY,DATEADD(MM,-1,GETDATE()))))) + ‘-‘ +RIGHT(REPLICATE(‘0’,1)+LTRIM(RTRIM(STR(DATEPART(MM,DATEADD(MM,-1,GETDATE()))))),2) + ‘-‘ +’01’)

o de una manera aún más sencilla

SELECT DATEADD(month, DATEDIFF(month, 0, DATEADD(month, -1,GETDATE())), 0)

Saludos

En ocasiones se necesita borrar datos de una tabla que estan “ligados” a otra, sin embargo dichos campos no necesariamente son llaves, por consecuencia el borrado es un poco mas complejo.

Encontré una manera mediante Triggers de hacer un borrado de datos de otras tablas cuando borras un dato de una tabla principal.

Les dejo el código

CREATE TRIGGER triggerdemo
ON dbo.bloque11
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @folio INTEGER
SELECT @folio=FOLIO FROM deleted
DELETE FROM bloque22
WHERE bloque22.Folio =@folio
END
GO

Espero les sea de utilidad

saludos