Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como podemos usar ISNULL para todos os nomes de coluna no SQL Server 2008?


Você pode usar ISNULL várias vezes na mesma instrução SQL para colunas diferentes, mas deve escrevê-lo separadamente para cada coluna:
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 você estiver criando uma consulta SQL dinâmica, teoricamente poderia reunir uma lista de colunas na tabela e gerar uma consulta com ISNULL em cada uma. Por exemplo:
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 tem problemas ao converter alguns tipos de coluna como timestamps para um nvarchar, mas ilustra a técnica.

Observe que, se você tiver outra coluna que deve ser retornada se um valor for nulo, poderá usar o COALESCE expressão assim:
SELECT COALESCE(ProductName, P_Id) AS Product...