有馬総一郎のブログ

(彼氏の事情)

2019年01月12日 03:06:51 JST - 1 minute read - SQL

selectで一気に変数をセットしようとして陥る落とし穴。前の値が残り続ける。

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 ステートメントが行を返さない場合、変数は現在の値を保ちます。

と書いてある。痛い目に遭うところだった…