これは、ツリーウォーカーを実装しようとする非常に奇妙な方法であり、SELECTで@idを増やし、サブクエリに適用されることを期待しています。SQL Serverは、クエリのセットアップフェーズで、サブクエリ式の@idの値を定数としてロックするため、機能しません。
この例を参照してください。返された@valueは、@ idが1でロックされていることを明確に示しています。質問では、@ idが0でロックされているため、@ id = 0に一致するものがないため、各サブクエリはNULLを返します。
create table table1 (
id int);
create table table2 (
id int, value varchar(10));
insert table1 values (1),(2),(3),(4);
insert table2 values
(1,1),
(2,2),
(3,3),
(4,4);
DECLARE @id INT, @value VARCHAR(10);
SELECT @id=1, @value='';
SELECT
@value = @value + (SELECT TOP 1 value FROM TABLE2 WHERE id=@id) + '-',
@id = @id+1
FROM TABLE1;
select @value, @id
-- result
1-1-1-1 5
単に2の値が必要な場合は、変数@idの代わりに、次のようにサブクエリをtable.idに関連付けます。
create table table1 (id int);
create table table2 (id int, value varchar(10));
insert table1 values (1),(2),(3),(4);
insert table2 values
(1,1),
(3,9),
(4,4);
DECLARE @value VARCHAR(10);
SELECT @value='';
SELECT
@value = @value + isnull((SELECT TOP 1 value
FROM TABLE2
WHERE id=table1.id) + '-','')
FROM TABLE1;
select @value
-- Result
1-9-4