Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо подзаявката вътре в рекурсивната конкатенация на низове винаги връща NULL?

Това е много странен начин да се опитате да приложите treewalker, увеличавайки @id в SELECT и очаквайки той да се приложи към подзаявката. Не работи, защото SQL Server заключва стойността на @id за израза на подзаявката като константа точно във фазата на настройка на заявката.

Вижте този пример, където върнатата @value ясно показва, че @id е заключен на 1. С вашия въпрос той беше заключен на 0, следователно всяка подзаявка ще върне NULL, привидно защото няма съвпадение за @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

Ако сте искали само стойностите от 2, тогава вместо променливата @id, просто свързвате подзаявката с table.id, както е по-долу:

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. Грешка при влизане в SQL Server:Неуспешно влизане за потребител 'NT AUTHORITY\SYSTEM'

  2. Единична sql заявка, която може да обработва както нулев, така и стойностен диапазон от дати в sql сървъра

  3. SQL Server 2012 копиране на база данни без данни

  4. Вижте какво прави sp_execute

  5. Изявлението за актуализация се изпълнява твърде дълго или не