sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo podemos usar ISNULL para todos los nombres de columna en SQL Server 2008?

Puede usar ISNULL varias veces en la misma instrucción SQL para diferentes columnas, pero debe escribirlo por separado para cada columna:

SELECT
    ISNULL(ProductName, 'No Data') AS ProductName,
    ISNULL(CAST(UnitPrice AS NVARCHAR), 'No Data') AS UnitPrice, 
    ISNULL(CAST(UnitsInStock AS NVARCHAR), 'No Data') AS UnitsInStock,
    ISNULL(CAST(UnitsOnOrder AS NVARCHAR), 'No Data') AS UnitsOnOrder
FROM tbl

Si está creando una consulta SQL dinámica, teóricamente podría recopilar una lista de columnas en la tabla y generar una consulta con ISNULL en cada una. Por ejemplo:

DECLARE @SQL nvarchar(max)

SET @SQL = 'SELECT '

SELECT @SQL = @SQL + 'ISNULL(CAST([' + sc.name + '] AS NVARCHAR), ''No Data'') AS [' + sc.name + '],'
FROM sys.objects so
INNER JOIN sys.columns sc ON sc.object_id = so.object_id
WHERE so.name = 'tbl'

-- Remove the trailing comma
SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 1) + ' FROM tbl'

EXEC sp_sqlexec @SQL

Este código tiene problemas al convertir algunos tipos de columnas como las marcas de tiempo en un nvarchar, pero ilustra la técnica.

Tenga en cuenta que si tuviera otra columna que debería devolverse si un valor es nulo, podría usar COALESCE expresión como esta:

SELECT COALESCE(ProductName, P_Id) AS Product...