Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi la sous-requête à l'intérieur de la concaténation de chaînes récursives renvoie-t-elle toujours NULL ?

C'est une façon très étrange d'essayer d'implémenter un treewalker, en augmentant @id dans le SELECT et en s'attendant à ce qu'il s'applique à la sous-requête. Cela ne fonctionne pas car SQL Server verrouille la valeur de @id pour l'expression de sous-requête en tant que droit constant lors de la phase de configuration de la requête.

Voir cet exemple, où la @value retournée indique clairement que @id est verrouillé à 1. Avec votre question, il était verrouillé à 0, donc chaque sous-requête renverra NULL, apparemment parce qu'il n'y a pas de correspondance pour @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

Si vous vouliez simplement les valeurs de 2, alors au lieu de la variable @id, vous corrélez simplement la sous-requête au table.id comme ci-dessous :

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