这是尝试实现 treewalker 的一种非常奇怪的方式,在 SELECT 中增加 @id 并期望它应用于子查询。它不起作用,因为 SQL Server 在查询设置阶段将子查询表达式的 @id 值锁定为常量。
请参阅此示例,其中返回的@value 清楚地表明@id 被锁定为 1。对于您的问题,它被锁定为 0,因此每个子查询将返回 NULL,表面上是因为 @id = 0 不匹配。
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 中的值,那么您只需将子查询与 table.id 相关联,而不是变量 @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