sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué la subconsulta dentro de la concatenación de cadenas recursivas siempre devuelve NULL?

Esta es una forma muy extraña de intentar implementar un Treewalker, aumentando @id en SELECT y esperando que se aplique a la subconsulta. No funciona porque SQL Server bloquea el valor de @id para la expresión de la subconsulta como una constante en la fase de configuración de la consulta.

Vea este ejemplo, donde el @valor devuelto indica claramente que @id está bloqueado en 1. Con su pregunta, estaba bloqueado en 0, por lo tanto, cada subconsulta devolverá NULL, aparentemente porque no hay ninguna coincidencia para @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 simplemente quería los valores de 2, entonces en lugar de la variable @id, simplemente correlacione la subconsulta con table.id como se muestra a continuación:

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