Mostrando las entradas con la etiqueta sql server. Mostrar todas las entradas
Mostrando las entradas con la etiqueta sql server. Mostrar todas las entradas

21 febrero 2009

COALESCE (Transact-SQL)

Hace poco estaba buscando la manera de que una query de selección SQL restringida por 4 parámetros unidos a su vez por AND, devuelva resultados a pesar de enviarle menos de los parámetros necesarios. Para explicar mejor mi punto, el código SQL era muy similar al siguiente:
DECLARE @param1 VARCHAR(25)
DECLARE @param2 VARCHAR(25)
SET @param1 = NULL
SET @param2 = NULL
SELECT id, nombre, grado, area FROM empleados
WHERE grado = @param1 AND area = @param2;
Lo anterior indica que si las dos expresiones después de la clausula WHERE son TRUE entonces se regresan resultados. ¿ Pero que sucede si solo mando un parámetro y yo deseo que busque por ese único parámetro ?, es ahí donde entra la función COALESCE. Básicamente evalúa una serie de expresiones y devuelve la primera expresión diferente de NULL, en cristiano: "El primer parámetro que lleve algún valor es el que se toma en cuenta". Ahora usaré el código anterior aplicando la función COALESCE:
DECLARE @param1 VARCHAR(25)
DECLARE @param2 VARCHAR(25)
SET @param1 = NULL
SET @param2 = NULL
SELECT id, nombre, grado, area FROM empleados
WHERE grado = COALESCE(@param1,grado) AND
area = COALESCE(@param2,area);
El cambio en el código fue usar la función donde se comparan las columnas empleados y area con @param1 y @param2 respectivamente. Al hacer esto, si por ejemplo @param1 no lleva valor entonces se regresará grado, que en este caso es una columna. Comparar la columna por si misma ayuda a que esa comparación devuelva un TRUE para todos los resultados posibles y así discriminar la búsqueda solo por el criterio restante (@param2).
Usar COALESCE es como usar un SWITCH que por defecto regresa un valor NULL. Para más detalle sobre la función dejo éstas ligas: COALESCE en Wikipedia y Microsoft Technet

04 octubre 2008

Borrar registros duplicados de un DataSet.

Si usas .Net para programar, alguna vez habrás usado el objeto DataSet para contener registros que provengan de una base de datos, que por lo general, está en SQL Sever. Si vas a llamar varias veces a una misma tabla y guardar el resultado de cada lectura en un solo dataset es recomendable ir actualizando los registro en este dataset para evitar duplicidad. El primer paso para ir combinando los registros en un dataset es usar el procedimiento Dataset.merge() y una vez terminado el llenado del dataset usar la siguiente función en código VB que recibe un dataset y el nombre del campo clave de la tabla como patrón para eliminar registros duplicados. Al terminar de buscar los registros repetidos regresa un nuevo dataset con registros únicos.
Public Shared Function delDupRows(ByVal dTable As DataSet, ByVal colName As String) As DataSet
Try
Dim hTable As Hashtable = New Hashtable()
Dim duplicateList As ArrayList = New ArrayList

For Each drow As DataRow In dTable.Tables(0).Rows
If (hTable.Contains(drow(colName))) Then
duplicateList.Add(drow)
Else
hTable.Add(drow(colName), String.Empty)
End If
Next drow

For Each drow As DataRow In duplicateList
dTable.Tables(0).Rows.Remove(drow)
Next drow

Return dTable
Catch ex As Exception
Return Nothing
End Try
End Function
End Class