我们如何将ISNULL用于SQL Server 2008中的所有列名?

Min*_*iel 12 sql sql-server-2008

我有个问题

我尝试过,google但看起来他们不喜欢*

我正在使用SQL Server 2008.

我有以下数据库表:

 P_Id   ProductName UnitPrice   UnitsInStock    UnitsOnOrder
------------------------------------------------------------------------
   1    Jarlsberg   10.45                 16    15
   2    Mascarpone  Null                  23    NULL 
   3    Gorgonzola  15.67                  9    20
Run Code Online (Sandbox Code Playgroud)

如果我需要null用字符串替换,我知道我这样做:

 SELECT ISNULL(UnitsOnOrder,'No Data') FROM tbl
Run Code Online (Sandbox Code Playgroud)

问题

  • 如何使用ISNULL()多列名称?
  • 是否可以使用它 *

喜欢

SELECT ISNULL(* , 'NO data') FROM tbl 
Run Code Online (Sandbox Code Playgroud)

我认为这将是棘手的因为数据类型,你不能将字符串传递给INT数据类型所以我怎么能解决这个问题呢

更新

好的,如果我使用ISNULL()数据类型int将返回0 哪个将是一个值,我怎么能传递空字符串?

Pau*_*ams 17

您可以在同一SQL语句中多次使用ISNULL用于不同的列,但您必须为每个列单独编写它:

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
Run Code Online (Sandbox Code Playgroud)

如果要构建动态SQL查询,理论上可以收集表中的列列表,并在每个列上生成带有ISNULL的查询.例如:

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
Run Code Online (Sandbox Code Playgroud)

将某些列类型(如时间戳)转换为nvarchar时,此代码存在问题,但它说明了该技术.

请注意,如果您有另一列,如果值为null,则应返回该列,您可以使用COALESCE表达式,如下所示:

SELECT COALESCE(ProductName, P_Id) AS Product...
Run Code Online (Sandbox Code Playgroud)