Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego podzapytanie wewnątrz rekurencyjnej konkatenacji ciągów zawsze zwraca NULL?

Jest to bardzo dziwny sposób na zaimplementowanie wędrowca po drzewie, zwiększając @id w SELECT i oczekując, że zastosuje się on do podzapytania. Nie działa, ponieważ SQL Server blokuje wartość @id wyrażenia podzapytania jako stałą w fazie konfiguracji zapytania.

Zobacz ten przykład, w którym zwrócona @value wyraźnie wskazuje, że @id jest zablokowane na 1. W twoim pytaniu zostało zablokowane na 0, stąd każde podzapytanie zwróci NULL, rzekomo dlatego, że nie ma dopasowania dla @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

Jeśli chcesz tylko wartości z 2, to zamiast zmiennej @id, po prostu skoreluj podzapytanie z table.id, jak poniżej:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie indeksu na zmiennej tabeli

  2. Jak wykonać zapytanie w pętli sql, aby sprawdzić różnicę między wartościami?

  3. Zwracanie wielu tabel z procedury składowanej

  4. Hiperłącz wartość w wyniku zapytania SQL Server w SSMS

  5. Używanie programu Excel do tworzenia pliku CSV ze znakami specjalnymi, a następnie importowanie go do bazy danych za pomocą SSIS