miércoles, 22 de diciembre de 2010

Id Faltantes

Identificar ID Faltantes

declare @idfaltante int =0;

declare @contador int = 0;

select @idfaltante = MAX(Keycol) from T1

declare @DesplegaFaltantes table(

Faltante int)

while @contador < @idfaltante

begin

set @contador = @contador + 1

insert into @DesplegaFaltantes values(@contador)

end

select faltante from @DesplegaFaltantes D

where not exists (select keycol from t1 where D.Faltante = T1.keycol)

martes, 15 de septiembre de 2009

Base de Datos Sospechosa

Ha Todo Nos ha pasado. Bueno a casi Todos.
Cuando SQL SERVER tiene una transacción Abierta y se apaga el servidor (no por el sistema operativo, sino porque un gracioso, lo desconecto por error) entonces la base de datos se queda en un Status de Suspect, en SQL 2000 para esta situación se solía hacer una combinación de cosas terribles…. Lo voy a describir pero no es para que lo hagan 
• Hackear las tablas de sistema para que la BD entre en un estado de emergencia (Para esto tendrías que actualizar los catálogos del sistema). Luego correr DBCC REBUILD_LOG para que el log de transacciones, se regenere.

Sucede que a partir de la versión 2005 DBCC REBUILD_LOG, no está soportado
Así que si te pasa algo similar ejecutas

ALTER DATABASE TuBaseDeDatos SET EMERGENCY;
GO
ALTER DATABASE TuBaseDeDatos SET SINGLE_USER;
GO
DBCC CHECKDB (TuBaseDeDatos, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO


No te dejes asustar por el parámetro que dice REPAIR_ALLOW_DATA_LOSS(aquí solo desmarca las transacciones que quedaron abierta para que haya consistencia en tu Base de datos)

Este artículo en Ingles está más que perfecto incluso para practicarlo
http://www.sqlskills.com/BLOGS/PAUL/post/TechEd-Demo-Creating-detaching-re-attaching-and-fixing-a-suspect-database.aspx

Indentities Not For Replication

Escenario:

Digamos que tienes una BD con mas de 200 Artículos publicado y deseas agregarle la opción de NOT FOR REPLICATION Los Identities, con este script(bastante sencillo pero efectivo) puedes de una pasada agregar la opción de Not For Replication en cada una de las tablas

EXEC sp_msforeachtable @command1 = ' declare @int int set @int =object_id("?") EXEC sys.sp_identitycolumnforreplication @int, 1'

Si lo que quieres es hacer lo contrario entonces sustituyes el 1 por un 0

viernes, 31 de julio de 2009

Quitar una columna de una Tabla publicada--- SQL 2000

La verdad es que es muyyy Sencillo, Solo tiene que correr este procedimiento
sp_repldropcolumn 'Clientes' , 'Dirreccion' donde cliente se refiere al nombre de la tabla y direcciona a la columna.-

Igual podrias ejecutar sp_repladdcolumn, a este ultimo le agregarias un tercer parametro indicando el tamano del campo y los consraints si asi lo deseas