我有一个动态的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
答案 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