Đây là một cách rất kỳ lạ khi cố gắng triển khai một treewalker, tăng @id trong SELECT và mong đợi nó áp dụng cho truy vấn con. Nó không hoạt động vì SQL Server khóa giá trị của @id cho biểu thức truy vấn con dưới dạng một hằng số ngay ở giai đoạn thiết lập truy vấn.
Hãy xem ví dụ này, trong đó @value trả về chỉ ra rõ ràng rằng @id bị khóa ở 1. Với câu hỏi của bạn, nó bị khóa ở 0, do đó mỗi truy vấn con sẽ trả về NULL, bề ngoài là do không có kết quả phù hợp với @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 [email protected]) + '-',
@id = @id+1
FROM TABLE1;
select @value, @id
-- result
1-1-1-1 5
Nếu bạn chỉ muốn các giá trị từ 2, thì thay vì biến @id, bạn chỉ cần tương quan truy vấn con với table.id như bên dưới:
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