Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum gibt die Unterabfrage innerhalb der rekursiven Zeichenfolgenverkettung immer NULL zurück?

Dies ist eine sehr seltsame Art zu versuchen, einen Treewalker zu implementieren, @id in SELECT zu erhöhen und zu erwarten, dass es auf die Unterabfrage angewendet wird. Es funktioniert nicht, weil SQL Server den Wert von @id für den Unterabfrageausdruck als Konstante direkt in der Abfrageeinrichtungsphase sperrt.

Sehen Sie sich dieses Beispiel an, in dem der zurückgegebene @Wert eindeutig anzeigt, dass @id bei 1 gesperrt ist. Bei Ihrer Frage war sie bei 0 gesperrt, daher gibt jede Unterabfrage NULL zurück, angeblich weil es keine Übereinstimmung für @id =0 gibt.

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

Wenn Sie nur die Werte von 2 wollen, dann korrelieren Sie statt der Variablen @id einfach die Unterabfrage mit der table.id wie unten:

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