Hay ocasiones en que se necesitan eliminar duplicados de nuestras tablas en la base de datos, un método sencillo para ubicarlos puede ser por ejemplo este query:

SELECT isourceid, isourcekind, iresourceId, COUNT(*) as repeticiones
INTO tabtemp
FROM relSRight
GROUP BY isourceid, isourcekind, iresourceId
HAVING COUNT(*) > 1

Con este query insertamos en una tabla temporal (tabtemp) los registros que están duplicados y la cantidad de repeticiones del mismo.

Ahora, lo que haremos es un cursor que irá analizando registro a registro de nuestra tabla temporal y eliminará los registros duplicados para cada conjunto, pero siempre dejando al menos un registro, es decir, si se encuentran 2 repeticiones de un registro borrará solamente una, si se encuentran 4 repeticiones del mismo borrará 3, y así sucesivamente.

DECLARE @isourceid int, @isourcekind int,@iresourceId int, @repeticiones int;
DECLARE @sqlexec varchar(200)
DECLARE dup_cursor
CURSOR FOR
SELECT isourceid, isourcekind, iresourceId, repeticiones
FROM tabtemp
OPEN dup_cursor;
FETCH NEXT FROM dup_cursor INTO @isourceid, @isourcekind, @iresourceId, @repeticiones;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlexec = ‘ set rowcount ‘ + CAST( (@repeticiones – 1) AS VARCHAR(3)) +
‘ delete from relSright where isourceid = ‘ + CAST(  @isourceid AS VARCHAR(10)) +
‘ and isourcekind = ‘ + CAST(  @isourcekind  AS VARCHAR(10)) +
‘ and iresourceId = ‘ +  CAST(@iresourceId AS VARCHAR(10))
EXEC(@sqlexec)
FETCH NEXT FROM dup_cursor INTO @isourceid, @isourcekind, @iresourceId, @repeticiones;
END
CLOSE dup_cursor;
DEALLOCATE dup_cursor;

 

Y con esto tenemos eliminados todas las repeticiones de nuestros registros en una tabla.

 

Espero sea de ayuda.

 

Saludos.

En ocasiones se necesita hacer un copiado de información de un TextBox a otro en ASP .NET, pero sin necesidad de que se haga un llamado al servidor (AutPost), por ejemplo, tuve la necesidad de hacer una operación entre 2 textbox y mostrarlo en otro que estuviera deshabilitado, entonces buscando un poco encontré esto y lo ajusté a mi proyecto.

Tu aspx debe de contener los 3 Textbox

<asp:TextBox ID=”txtSacos” runat=”server” onkeyup=”Operacion();”></asp:TextBox>

<asp:TextBox ID=”txtBolsas” runat=”server” onkeyup=”Operacion();”></asp:TextBox>

<asp:TextBox ID=”txtResultado” runat=”server”></asp:TextBox>

y en la cabecera el código JavaScript

<head>

<title></title>

<script type=”text/javascript”>

function Operacion() {

var sacos = document.getElementById(‘<%= txtSacos.ClientID %>’).value;

var bolsas = document.getElementById(‘<%= txtBolsas.ClientID %>’).value;

if (sacos != && bolsas != )

document.getElementById(‘<%= txtResultado.ClientID %>’).value = bolsas + sacos;

}

</script>

</head>

Y eso es todo

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í

Resulta que por enésima ocasión tuve la necesidad de pasar un string de caracteres como parámetro de un SP de la forma: “3,4,14,29,53,98” donde cada número separado por la coma lo necesito utilizar dentro de un Query como parte de un IN, p.e. Select * from tabla where identificador IN (3,4,14,29,53,98), pero estos valores los recibo como un string, entonces fue cuando entra la duda de como poder hacer ese query con los valores que vienen en una cadena, es decir, como quitarle las “” y utilizar el valor.

Después de navegar un rato por la red encontré un método sencillo, donde se va recorriendo el valor de la cadena y se va metiendo cada valor encontrado en una tabla temporal y posteriormente utilizas una consulta del tipo: Select * from tabla Where identificador IN (Select campotmp from #tablatmp) y eso es todo.

He aquí el ejemplo:

Continue reading

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 es necesario hacer un cambio de nombre de la base de datos que estamos utilizando en SQL 2005 o 2008, para ello, es probable que les mande un error al momento de intentar hacerlo directamente con el clic derecho.

Por esto, les mando un script para realizarlo de manera efectiva y sin complicaciones

ALTER DATABASE dboldname SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
SP_RENAMEDB dboldname, dbnewname
GO
ALTER DATABASE dbnewname SET MULTI_USER
GO

y eso es todo…

Espero haya sido de utilidad

saludos

Quiero mostrarles unos sencillos pasos para migrar una base de datos de SQL 2000 a SQL 2008, lo publico debido a que siguiendo los pasos comunes no funciona, pero siguiendo estos si me funcionó, así­ que espero sea de ayuda.

Primero hay que hacer un backup de la base de datos a migrar:

— Abrir el Query Analizer de SQL 2000
— Abrir una ventana para un nuevo query sobre la base de datos a migrar y escribir lo siguiente

BACKUP DATABASE dbdummy TO DISK = ‘c:\dbdummybackup.bak’

— dbdummy es el nombre de mi base de datos, ahí deben escribir el que ustedes ocupen
— Ejecutar ese query y esperar a que termine.
— Una vez ejecutado el proceso, corroborar en la ruta donde se indicó, que exista el archivo (c:\dbdummybackup.bak)

— Después, abrir el SQL Server Management Studio 2008
— Abrir una ventana para un nuevo query sobre la base de datos master y escribir lo siguiente

RESTORE FILELISTONLY FROM DISK = ‘c:\dbdummybackup.bak’
GO

— Ejecutar ese query y esperar a que termine.
— Aparecerá una tabla de resultados en la cual debemos anotar los nombres que vienen en el campo LOGICALNAME
— Ahora ejecutaremos otro query, deberemos escribir

RESTORE DATABASE dbdummy2008  — nombre de la nueva base de datos
FROM DISK = ‘c:\dbdummybackup.bak’
WITH
MOVE ‘dbdummy_data’ TO ‘c:\Bd2008\dbdummy2008.mdf’,
— lo primero es el nombre que obtuvimos del query anterior del MDF y la ruta donde se almacenará
MOVE ‘dbdummy_log’ TO ‘c:\Bd2008\dbdummy2008.ldf’
— lo primero es el nombre que obtuvimos del query anterior del LOG y la ruta donde se almacenará
GO

— Ejecutar el query y esperar a que termine

Espero haya sido de ayuda

saludos