SQL Server: 変数にSELECTした結果を代入する方法 | WEBエンジニア社長のブログ この便利な方法、実は大きな落とし穴がある。
create table SAMPLE_TABLE (
PARAM1 varchar not null -- 値1
, PARAM2 varchar not null -- 値2
, COND varchar not null -- 条件
);
insert into SAMPLE_TABLE values
('A', '1', '1')
,('B', '2', '2')
;
drop procedure testpro;
create procedure testpro as
begin
set NOCOUNT on;
declare @PARAM1 varchar; -- 値1
declare @PARAM2 varchar; -- 値2
select @PARAM1 = PARAM1, @PARAM2 = PARAM2 from SAMPLE_TABLE where COND = '1';
print 'param1=' + @PARAM1 + ',param2=' + @PARAM2;
select @PARAM1 = PARAM1, @PARAM2 = PARAM2 from SAMPLE_TABLE where COND = '3';
print 'param1=' + @PARAM1 + ',param2=' + @PARAM2;
select @PARAM1 = PARAM1, @PARAM2 = PARAM2 from SAMPLE_TABLE where COND = '2';
print 'param1=' + @PARAM1 + ',param2=' + @PARAM2;
end
go
execute testpro;
実行すると以下のようになる
param1=A,param2=1
param1=A,param2=1
param1=B,param2=2
二番目はNULLで出力されると思いきや一番目のselectで取得して設定した変数値がそのまま出力される。
SELECT @local_variable (Transact-SQL) | Microsoft Docs
SELECT ステートメントが行を返さない場合、変数は現在の値を保ちます。
と書いてある。痛い目に遭うところだった…