Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come possiamo utilizzare ISNULL per tutti i nomi di colonna in SQL Server 2008?

Puoi utilizzare ISNULL più volte nella stessa istruzione SQL per colonne diverse, ma devi scriverlo separatamente per ogni colonna:

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

Se stai creando una query SQL dinamica, potresti teoricamente raccogliere un elenco di colonne nella tabella e generare una query con ISNULL su ciascuna. Ad esempio:

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

Questo codice presenta problemi durante la conversione di alcuni tipi di colonna come timestamp in un nvarchar, ma illustra la tecnica.

Tieni presente che se hai un'altra colonna che dovrebbe essere restituita se un valore è null, puoi utilizzare COALESCE espressione come questa:

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