Как найти идентификаторы, которые не существуют в таблице - PullRequest
0 голосов
/ 02 февраля 2020

Мой SP имеет входной параметр @serviceIds = 1,2,3,4,5,6,7,8;. Входной параметр состоит из разделенных запятыми идентификаторов. У меня есть таблица с именем service как

+-----------+-------------+
| ServiceID | ServiceName |
+-----------+-------------+
| 1         | test1       |
+-----------+-------------+
| 2         | test2       |
+-----------+-------------+
| 3         | test3       |
+-----------+-------------+
| 4         | test4       |
+-----------+-------------+
| 5         | test5       |
+-----------+-------------+

. Мне нужно проверить, существуют ли эти конкретные идентификаторы в таблице. как мне это сделать? Согласно приведенному выше примеру, мне нужен этот разделенный запятыми вывод. 6,7,8

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы можете использовать not exists и string_split():

select ss.value
from string_split(@serviceids, ',') ss
where not exists (select 1
                  from service s
                  where try_convert(int, ss.value) = s.id
                 );

Вы не можете контролировать значения, передаваемые в хранимую процедуру, поэтому для предотвращения ошибок преобразования используется try_convert() - при условии, что столбец сравнения представляет собой число.

РЕДАКТИРОВАТЬ:

Вы можете повторно объединить значения, если хотите:

select string_agg(ss.value, ',') within group (order by ss.value)
from string_split(@serviceids, ',') ss
where not exists (select 1
                  from service s
                  where try_convert(int, ss.value) = s.id
                 );
0 голосов
/ 02 февраля 2020

STRING_SPLIT разделит строку с разделителем на таблицу, а STRING_AGG объединит все строки оператора select в строку.

Declare @serviceIds as varchar(max) = '1,10,3,4,5,6,7,8'

Select
    STRING_AGG([value],',') as Result
from STRING_SPLIT (@serviceIds , ',' )
Where [value] not in (Select ServiceID from [service])
...