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ですか?

私はMSSQLServer2000を使用しています。

X-ZEROの説明

これは、webappajax応答で使用するためのものです。クエリによってWebサービスに返される何らかの結果セットを必要とするバックエンドJavaフレームワークを変更することはできません。

解決

他の誰かがこの質問をしている場合、そしてそれが答えで完全に明確ではなかったので、これはうまくいきました:

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

同じWHERE句を使用してステートメントの結果セットレコード数を取得できますが、それがゼロの場合は、null値を持つ1つのレコードを返すことができます。

例:

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 に答える
1

私があなたの質問を理解しているなら、あなたはステートメントがnull実際のクエリから行が返されないときからなる単一の行を返すことを望みます。または、言い換えると、値を返さないはずのときに値(null)を返すようにします。

代わりに、クエリをそのままにして、ステートメントによって返される行数のカウントを取得する必要があると思います。@@rowcountクエリを実行した後、変数を使用してこれを実行できると思います。

(免責事項:GoogleとSOから学んだSQL Serverについて私が知っていること)

于 2012-05-30T00:18:18.623 に答える
0

回避@@ROWCOUNTするもう1つのオプションは、結果をテーブル変数に保存し、存在する場合と存在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 に答える