Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie können wir ISNULL für alle Spaltennamen in SQL Server 2008 verwenden?

Sie können ISNULL mehrmals in derselben SQL-Anweisung für verschiedene Spalten verwenden, aber Sie müssen es für jede Spalte separat schreiben:

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

Wenn Sie eine dynamische SQL-Abfrage erstellen, könnten Sie theoretisch eine Liste von Spalten in der Tabelle zusammenstellen und für jede eine Abfrage mit ISNULL generieren. Zum Beispiel:

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

Dieser Code hat Probleme beim Konvertieren einiger Spaltentypen wie Zeitstempel in ein nvarchar, aber er veranschaulicht die Technik.

Beachten Sie, dass Sie, wenn Sie eine andere Spalte hätten, die zurückgegeben werden sollte, wenn ein Wert null ist, den VEREINIGUNG Ausdruck wie folgt:

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