如何在SQL Server 2008中使用ISNULL函数处理所有列名?

12

我有一个问题

我试着谷歌了一下,但好像他们不喜欢*

我正在使用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
如果我需要用一个字符串来替换null,我知道应该这样做:
 SELECT ISNULL(UnitsOnOrder,'No Data') FROM tbl

问题

  • 如何在多列名称中使用ISNULL()函数?
  • 能否在*通配符中使用它?

类似于

SELECT ISNULL(* , 'NO data') FROM tbl 

由于数据类型的问题,我认为这将会很棘手,您不能将字符串传递给 INT 数据类型,那么我该如何解决呢?

更新

好的,如果我使用 ISNULL() 并设置数据类型为 int,它将返回 0,这对我来说是一个值,但我该如何传递空字符串呢?


2
不行,你必须单独列出每一列。 - Mike Christensen
为什么需要使用 *?如果在字段列表中有列,那么它不起作用吗? - Mikael Eriksson
1
@MikaelEriksson他不想用isnull来包装选择列表中的每一列。我觉得这是在治标不治本... - Tony Hopkinson
不,我正在开发一个应用程序,从客户端收集SQL查询并将此查询作为字符串传递到服务器,然后将该字符串作为EXEC执行,将数据带回客户端。因此,我希望有人在代码后面将*传递给SP,我将所有我的数据返回为字符串,我认为我应该在代码后面解决这个问题。 - Mina Gabriel
1
@MinaGabriel - 在结果显示时进行这个操作绝对是正确的方法。数据层应始终与表示层分离。 - Mike Christensen
@MinaGabriel - 听起来这个应用程序容易受到SQL注入攻击的威胁。小心传递SQL语句。最好在服务器端构建SQL命令并传递参数。 - Paul Williams
2个回答

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

如果你正在构建动态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

这段代码在将一些列类型如时间戳转换为nvarchar时存在问题,但它展示了该技术的用法。

请注意,如果您有另一个列应该在值为空时返回,可以使用COALESCE表达式,像这样:

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

2

试试这个...

ISNULL (COALESCE (column1, column2), 'No Data')

您需要包含所有列名,不能使用星号(*)。

COALESCE函数返回其参数列表中第一个非空值,如果它们都为空,则返回null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接