是否可以迭代tsql中的数字列表?

时间:2018-06-13 07:53:26

标签: sql-server list tsql iteration

我有一个以逗号分隔的personID列表: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并检查列表中的ID是否不在SELECT personID FROM dbo.tablePersons中。目标是在列表中找到SELECT personID FROM dbo.tablePersons中的所有ID。

鉴于这个伪代码不可行 - 这是一种解决方法吗?

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

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);