Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment pouvons-nous utiliser ISNULL pour tous les noms de colonne dans SQL Server 2008 ?

Vous pouvez utiliser ISNULL plusieurs fois dans la même instruction SQL pour différentes colonnes, mais vous devez l'écrire séparément pour chaque colonne :

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 vous créez une requête SQL dynamique, vous pouvez théoriquement rassembler une liste de colonnes dans la table et générer une requête avec ISNULL sur chacune d'elles. Par exemple :

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

Ce code a des problèmes lors de la conversion de certains types de colonnes comme les horodatages en nvarchar, mais il illustre la technique.

Notez que si vous avez une autre colonne qui doit être renvoyée si une valeur est nulle, vous pouvez utiliser le COALESCER expression comme celle-ci :

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