0

我有一个动态的 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 框架,该框架需要查询将某种结果集返回给 web 服务。

解决方案

万一其他人有这个问题,并且因为答案并不完全清楚,这有效:

--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

4 回答 4

1

如果我理解您的问题,您希望该语句返回一行,其中包含null从实际查询中没有返回任何行的时间。或者,换一种说法,当它不应该返回任何值时,您希望它返回一个值(null)。

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

(免责声明:我从 Google 和 SO 那里学到的关于 SQL Server 的知识)

于 2012-05-30T00:18:18.623 回答
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)                    ;

希望这对你有帮助!

于 2012-05-30T00:18:52.373 回答
0

另一个避免的选择@@ROWCOUNT是将结果保存在表变量中,然后返回结果(如果存在或NULL不存在)。例如:

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
于 2016-03-01T11:58:36.130 回答
0

查看关于 MAX(Transact-SQL) 的 SQL 文档。“当没有行可供选择时,MAX 返回 NULL。”。我应该对 SqlServerCentral 上的这个答案表示赞赏。

DECLARE @sql VARCHAR(128)
SET @sql = 'SELECT MAX(a), MAX(b) FROM c WHERE a = ' + @a
EXEC SP_EXECUTESQL @sql
于 2020-02-26T00:06:26.150 回答