SQl Server – COALESCE

La definición de Microsoft para esta funcion es:

Returns the data type of expression with the highest data type precedence. If all expressions are nonnullable, the result is typed as nonnullable.

Es decir, Regresa el tipo de dato de la expresión con el tipo mas alto de precedencia. Si todas las expresiones son No Permite Null, el resultado será del tipo No Permite Null. Lo que esto quiere decir, es que del conjunto de valores que le pasamos a la funcion Coalesce nos regresara el primero que no sea null, para ilustrarlo encontré entre mis fuentes un ejemplo que me pareció el mas claro de todos,

SELECT COALESCE(NULL, NULL, NULL, GETDATE())

Esto lo que nos regresará será la fecha actual tal y como un GetDate() lo haría.

Ahora, algo que me pareció sumamente interesante fue el siguiente ejemplo(todas las fuentes prometo ponerlas al final de este post), usando el Coalesce con Pivot,

Si se ejecuta lo siguiente en la basa de datos de SQL Server AdventureWorks,

SELECT Name
FROM HumanResources.Department
WHERE (GroupName = 'Executive General and Administration')

Obtendriamos algo como,

Entonces, si quisieramos pivotear esa información, tendríamos que ejecutar lo siguiente,

DECLARE @DepartmentName VARCHAR(1000)

SELECT @DepartmentName = COALESCE(@DepartmentName,”) + Name + ‘;’
FROM HumanResources.Department
WHERE (GroupName = ‘Executive General and Administration’)

SELECT @DepartmentName AS DepartmentNames

y obtendríamos algo como esto,

genial!!! =)

Ahora, podemos utilizar el Coalesce para ejecutar multiples sentencias de SQL, ya que sabemos como pivotera información usando el Coalesce, realmente no resulta tan complicado pensarle otras aplicaciones a lo mismo, y bueno, este es el caso, el ejmplo consiste en encontrar los valores de cada columna en el esquema Person que tiene la columna llamada “Name”. Si se ejecuta el siguiente script obtendriamos justo eso.

DECLARE @SQL VARCHAR(MAX)

CREATE TABLE #TMP
(Clmn VARCHAR(500),
Val VARCHAR(50))

SELECT @SQL=COALESCE(@SQL,”)+CAST(‘INSERT INTO #TMP Select ”’ + TABLE_SCHEMA + ‘.’ + TABLE_NAME + ‘.’
+ COLUMN_NAME + ''' AS Clmn, Name FROM ' + TABLE_SCHEMA + '.[' + TABLE_NAME +
'];' AS VARCHAR(MAX))
FROM INFORMATION_SCHEMA.COLUMNS
JOIN sysobjects B ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = B.NAME
WHERE COLUMN_NAME = 'Name'
AND xtype = 'U'
AND TABLE_SCHEMA = 'Person'

PRINT @SQL
EXEC(@SQL)

SELECT * FROM #TMP
DROP TABLE #TMP

y el resultado sería el siguiente,

Bueno, que esta otra opción es mucho mejor y así como lo menciona el autor original, es un gran descubrimiento. Si se quieren matar todas las transacciones en la base de datos usando tres líneas de código, si alguna vez han intentado restaurar una base de datos y no pudieron obtener acceso exclusivo, entonces saben lo fantastico de esto,

DECLARE @SQL VARCHAR(8000)

SELECT @SQL=COALESCE(@SQL,'')+'Kill '+CAST(spid AS VARCHAR(10))+ '; '
FROM sys.sysprocesses
WHERE DBID=DB_ID('AdventureWorks')

PRINT @SQL --EXEC(@SQL) Replace the print statement with exec to execute

con lo que obtendrán lo siguiente(o bueno parecido)

Bueno pues, para mi esto ha sido un gran descubrimiento y espero sinceramente que para alguien mas resulte útil también.

Fuentes:

Fuente 1

Fuente 2

 

 

One response to “SQl Server – COALESCE

  1. Pingback: SQl Server – COALESCE « DbRunas – Noticias y Recursos sobre Bases de Datos

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s