Можно ли перебрать список чисел в TSQL? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть список идентификаторов персон, разделенных запятыми: 1265, 8632.То, что я хочу сделать, - это то, что я хотел бы указать с помощью блока псевдокода, который, конечно, не работает.

declare @max int = (select count(*) from dbo.tablePersons)-1
declare @cnt = 0
    BEGIN
        SELECT personID FROM dbo.tablePersons 
        WHERE (1265, 8632)[@cnt] 
        IS NOT IN SELECT personID FROM  dbo.tablePersons
    SET @cnt = @cnt + 1
    END

Я хочу перебрать список 1265, 8632 и проверитьнет ли идентификаторов в списке в SELECT personID FROM dbo.tablePersons.Цель состоит в том, чтобы найти все те идентификаторы в моем списке, которые есть в SELECT personID FROM dbo.tablePersons.

Учитывая тот факт, что этот псевдокод нежизнеспособен - есть ли какое-то решение?

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете попробовать это:

DECLARE @mockperson TABLE(ID INT, PersName VARCHAR(100));
INSERT INTO @mockperson VALUES
 (1,'pers 1')
,(2,'pers 2');

DECLARE @yourlist VARCHAR(100)='1,999,2';

- Запрос разбивает данный список и проверяет числа NOT IN таблица персон

WITH Casted AS
(
    SELECT CAST('<x>' + REPLACE(@yourlist,',','</x><x>') + '</x>' AS XML) AS TheListAsXml
)
SELECT x.value('text()[1]','int')
FROM Casted
CROSS APPLY TheListAsXml.nodes('/x') AS A(x)
WHERE x.value('text()[1]','int') NOT IN(SELECT ID FROM @mockperson);

Начиная с v2016

С STRING_SPLIT() (v2016 +) это будет тот же подход, просто проще

SELECT *
FROM STRING_SPLIT(@yourlist,',') AS A
WHERE A.value NOT IN(SELECT ID FROM @mockperson);
...