viernes, 6 de julio de 2007

Conocer el tamaño que ocupa cada tabla


IF EXISTS ( SELECT name FROM sysobjects
WHERE name = 'TamanoPorTablas'
AND type = 'U')Drop Table TamanoPorTablasGO

CREATE TABLE [TamanoPorTablas] ( [Name] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Rows] [varchar] (18) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [reserved] [varchar] (18) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [data] [varchar] (18) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [indexsize] [varchar] (18) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [unused] [varchar] (18) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , CONSTRAINT [PK_TamanoPorTablas] PRIMARY KEY CLUSTERED ( [Name] ) ON [PRIMARY] ) ON [PRIMARY]GO

DECLARE @Tabla Varchar(100), @Query Varchar(100)

Declare CrTabla Cursor for
SELECT Name
FROM Sysobjects
WHERE TYPE = 'U'

Open CrTabla
Fetch Next From CrTabla
Into @Tabla

While (@@Fetch_Status = 0)
begin
Set @Query = 'insert into TamanoPorTablas Exec sp_spaceused '+@Tabla
Exec (@Query)
Fetch Next from CrTabla
into @Tabla
end

Close CrTabla
Deallocate CrTabla

Obtener todos los campos de una base de datos...

...de las tablas de usuarios, junto con la tabla a que pertenecen, el tipo de datos que almacena y la longitud del mismo. Excelente a la hora de documentar.

SELECT C.Name Campo, O.Name Tabla, T.Name as Tipo, C.Length--, *FROM SYSCOLUMNS CINNER JOIN SYSOBJECTS O ON O.Id = C.IdINNER JOIN Systypes T ON T.Xtype = C.XtypeWHERE O.xtype = 'U'ORDER BY C.Name , O.Name

Saber si un día fue fin de semana

Declare @Hoy int, @Fecha SmallDateTime
Set @Fecha = '01/08/2007'
Set @Hoy = ( select DATEPART(WEEKDAY, @Fecha) )
if @Hoy in (7, 1) Print 'Fue fin de semana'else Print 'No fue fin de semana'

Kill todos los procesos de una DB

Procedimiento que "tumba" todos los procedimientos de una BD en específico...

Create Procedure KillAllProcessInDB
@DbName VarChar(100)
as

if db_id(@DbName) = Null
begin
Print 'Especifique el nombre de la base de datos'
end
else
Begin
Declare @spId Varchar(30)

DECLARE TmpCursor CURSOR FOR
Select 'Kill ' + convert(Varchar, spid) as spId
from master..SysProcesses
where db_Name(dbID) = @DbName
and spId <> @@SpId
and dbID <> 0

OPEN TmpCursor

FETCH NEXT FROM TmpCursor
INTO @spId

WHILE @@FETCH_STATUS = 0
BEGIN
Exec (@spId)

FETCH NEXT FROM TmpCursor
INTO @spId
END

CLOSE TmpCursor
DEALLOCATE TmpCursor

end

Busca en todas las tablas de una BD

--*** PROCEDIMIENTO ALMACENADO PARA HACER UNA BUSQUEDA ***--

--*** EN CAMPOS ALFANUMERICOS DE TODAS LAS TABLAS DE UNA ***--

--*** BASE DE DATOS EN ESPECIFICO. ***--

--*** FECHA DE CREACION: 12 DE JUNIO DEL 2006 ***--

--*** CREADO POR: ELENA LOPEZ ***--

CREATE PROCEDURE BuscarTodasTablas (@SearchStr nvarchar(100))ASBEGIN
CREATE TABLE #Results (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 NULLBEGINSET @ColumnName = ''SET @TableName = (SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))FROM INFORMATION_SCHEMA.TABLESWHERE TABLE_TYPE = 'BASE TABLE'AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableNameAND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)BEGINSET @ColumnName =(SELECT MIN(QUOTENAME(COLUMN_NAME))FROM INFORMATION_SCHEMA.COLUMNSWHERE 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 NULLBEGININSERT INTO #ResultsEXEC('SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2)ENDEND END
SELECT ColumnName, ColumnValue FROM #ResultsEND
GO

Convertir de número a letras... Stored Procedure

CREATE PROCEDURE sp_Num2Let @Numero NUMERIC(20,2) ASBEGINSET NOCOUNT ONDECLARE @lnEntero INT, @lcRetorno VARCHAR(512), @lnTerna INT, @lcMiles VARCHAR(512), @lcCadena VARCHAR(512), @lnUnidades INT, @lnDecenas INT, @lnCentenas INT, @lnFraccion INT
SELECT @lnEntero = CAST(@Numero AS INT), @lnFraccion = (@Numero - @lnEntero) * 100, @lcRetorno = '', @lnTerna = 1
WHILE @lnEntero > 0 BEGIN /* WHILE */ -- Recorro terna por terna SELECT @lcCadena = '' SELECT @lnUnidades = @lnEntero % 10 SELECT @lnEntero = CAST(@lnEntero/10 AS INT) SELECT @lnDecenas = @lnEntero % 10 SELECT @lnEntero = CAST(@lnEntero/10 AS INT) SELECT @lnCentenas = @lnEntero % 10 SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
-- Analizo las unidades SELECT @lcCadena = CASE /* UNIDADES */ WHEN @lnUnidades = 1 AND @lnTerna = 1 THEN 'UNO ' + @lcCadena WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN 'UN ' + @lcCadena WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena ELSE @lcCadena END /* UNIDADES */
-- Analizo las decenas SELECT @lcCadena = CASE /* DECENAS */ WHEN @lnDecenas = 1 THEN CASE @lnUnidades WHEN 0 THEN 'DIEZ ' WHEN 1 THEN 'ONCE ' WHEN 2 THEN 'DOCE ' WHEN 3 THEN 'TRECE ' WHEN 4 THEN 'CATORCE ' WHEN 5 THEN 'QUINCE ' ELSE 'DIECI' + @lcCadena END WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN 'VEINTE ' + @lcCadena WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN 'VEINTI' + @lcCadena WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN 'TREINTA ' + @lcCadena WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN 'TREINTA Y ' + @lcCadena WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN 'CUARENTA ' + @lcCadena WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN 'CUARENTA Y ' + @lcCadena WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN 'CINCUENTA ' + @lcCadena WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN 'CINCUENTA Y ' + @lcCadena WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN 'SESENTA ' + @lcCadena WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN 'SESENTA Y ' + @lcCadena WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN 'SETENTA ' + @lcCadena WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN 'SETENTA Y ' + @lcCadena WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN 'OCHENTA ' + @lcCadena WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN 'OCHENTA Y ' + @lcCadena WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN 'NOVENTA ' + @lcCadena WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN 'NOVENTA Y ' + @lcCadena ELSE @lcCadena END /* DECENAS */
-- Analizo las centenas SELECT @lcCadena = CASE /* CENTENAS */ WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' + @lcCadena WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN 'CIENTO ' + @lcCadena WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena ELSE @lcCadena END /* CENTENAS */
-- Analizo la terna SELECT @lcCadena = CASE /* TERNA */ WHEN @lnTerna = 1 THEN @lcCadena WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL ' WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND @lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + ' MILLON ' WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena + ' MILLONES ' WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN @lcCadena + ' MIL MILLONES ' ELSE '' END /* TERNA */
-- Armo el retorno terna a terna SELECT @lcRetorno = @lcCadena + @lcRetorno SELECT @lnTerna = @lnTerna + 1
END /* WHILE */
IF @lnTerna = 1 SELECT @lcRetorno = 'CERO'
SELECT RTRIM(@lcRetorno) + ' CON ' + LTRIM(STR(@lnFraccion,2)) + '/100'
END
GO

Fuente: http://portalfox.com/index.php?name=News&file=article&sid=417&mode=nested&order=0&thold=0

SQL Server: Mi pasión...

En honor al amor a mi trabajo, a lo que hago y a lo que me gusta, empiezo a renovar mi blog, para almacenar en él, aquellas cosas que hago, que guardo, que poseeo y que colecciono y que no me gustaría perder...