如果没有结果,则返回null而不是null

时间:2012-05-29 23:58:50

标签: sql sql-server sql-server-2000 resultset dynamic-sql

我有一个动态的sql语句,可能会也可能不会返回任何结果。为简单起见:

--other SQL statements defining @a
DECLARE @sql varchar(128)
SELECT @sql = 'SELECT a, b FROM c WHERE a = ' + @a
EXEC(@sql)

我希望结果如果此语句返回任何结果,但如果EXEC(@sql)未返回任何结果,我该如何才能返回单null

我正在使用MS SQLServer 2000。

X-ZERO的说明

这适用于webapp ajax响应。我无法改变后端java框架,它需要某种结果集才能被查询返回给webservice。

如果其他人有这个问题并且答案中的答案并不完全清楚,那就有效了:

--other SQL statements defining @a
DECLARE @sql varchar(128)
SELECT @sql = 'SELECT a, b FROM c WHERE a = ' + @a
EXEC(@sql)
IF @@ROWCOUNT = 0 SELECT null

4 个答案:

答案 0 :(得分:1)

如果我理解了您的问题,那么当没有从实际查询返回任何行时,您希望语句返回由null组成的单行。或者换句话说,当它应该不返回任何值时,你希望它返回一个值(null)。

我认为您应该做的是将查询保持原样并获取该语句返回的行数。我相信您可以在执行查询后使用@@rowcount变量执行此操作。

(免责声明:我从Google和S.O中学到的SQL Server知识。)

答案 1 :(得分:1)

您可以获取具有相同WHERE子句的语句的结果集记录计数,并且它为零,那么您只需返回一个具有空值的记录。

示例:

declare @sql varchar(128)
declare @a varchar(10);
set @a = '''Some @a value''';

declare @rowcount int;
exec sp_executesql N'select @rowcount=count(*) FROM c WHERE a = ''Some @a value''', 
                    N'@rowcount int output', @rowcount output;

if @rowcount <> 0
begin
  select @sql = 'SELECT a, b FROM c WHERE a = ' + @a
end
else
begin
  select @sql = 'select null';
end

exec(@sql)                    ;

希望这能帮到你!

答案 2 :(得分:0)

避免@@ROWCOUNT的另一个选项是将结果保存在表变量中,如果存在,则返回结果;如果不存在,则返回NULL。 E.g:

DECLARE @results TABLE(a int, b int)
DECLARE @sql nvarchar(128)
SELECT @sql = 'SELECT a, b FROM c WHERE a = ' + @a

insert into @results
exec (@sql)

IF EXISTS(select top 1 * from @results)
SELECT * from @results
ELSE SELECT null

答案 3 :(得分:0)

查看the SQL Docs on MAX(Transact-SQL)。 “没有可供选择的行时,MAX返回NULL。”。我应该感谢this answer on SqlServerCentral

DECLARE @sql VARCHAR(128)
SET @sql = 'SELECT MAX(a), MAX(b) FROM c WHERE a = ' + @a
EXEC SP_EXECUTESQL @sql