SQL PRINT 语句不打印任何内容

use*_*601 7 sql-server stored-procedures t-sql

我没有得到这个简单PRINT语句的任何输出。我错过了什么?

sqlfiddle 中提供的数据

DECLARE @team varchar(20)

BEGIN
   SELECT @team = TEAM
   FROM DISTRIB_LINE 
   PRINT 'value is' + @team
END
Run Code Online (Sandbox Code Playgroud)

And*_*y M 11

如果表达式的计算结果为空,则 PRINT 语句将不打印任何内容。显然@team,作为前面语句的结果最终为 null,导致 PRINT 不输出任何内容。如果您想在变量为空时打印某些内容,请使用 ISNULL 或 COALESCE:

PRINT 'value is ' + ISNULL(@team, '(null)');
Run Code Online (Sandbox Code Playgroud)

您还可以向 SELECT 添加过滤器以确保跳过 NULL(如果您希望跳过它们,那就是):

SELECT @team = TEAM
FROM DISTRIB_LINE
WHERE TEAM IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

但是,如果表中没有行或所有TEAM值都为空,则此语句将不进行任何赋值。在这种情况下,如果 PRINT 仍然不输出任何内容,则意味着@team即使在 SELECT 之前也是空的。因此,您可能仍需要应用以前的方法。

此外,当表有很多行时,以这种方式分配变量不是一个好主意,因为您无法控制最终分配哪个值。所以。Alexei在使用 TOP 以及将其与 ORDER BY 以及可能的其他过滤器相结合方面也有自己的观点

  • @IanKemp:我希望从来没有这样的概念,即连接 null 可以产生除 null 以外的任何东西。与此相关(尽管与此问题无关),我希望 Oracle 从未在其数据库产品中将空(零长度)字符串的概念与空(未知)字符串的概念混为一谈。 (2认同)

Ale*_*xei 6

PRINT输出消息,而不是结果集。尝试类似以下内容:

DECLARE @team varchar(20)
SELECT TOP 1 @team = TEAM
FROM DISTRIB_LINE 

SELECT @team AS Team
Run Code Online (Sandbox Code Playgroud)

我的示例包含TOP因为我已确保@team接收单个值。但是,它的值将不明确(非确定性)。最确定的是使用ORDER BY子句和 aWHERE强制执行单个记录)。