在SQL Server中的IN拆分函数中找到的记录的精确排序顺序

use*_*159 0 sql sql-server stored-procedures sql-server-2014 sql-server-2016

我需要返回以逗号分隔的字符串发送到存储过程的记录 - 如下所示:

@PMID = 29573145,24106086,20513766,24326307
Run Code Online (Sandbox Code Playgroud)

我有一个存储过程来拉取记录,如

SELECT 
    data, 
    PMID  
FROM
    [dbo].[ADMIN_Publication_JSON] 
WHERE 
    PMID IN (SELECT DATA FROM dbo.Split(@PMID, ',')) 
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是返回记录集是随机的,我需要它是精确的,因为我的最终用户可以更改顺序,并且记录需要按顺序显示,这将改变逗号字符串中的顺序.这是可能的还是我需要完全改变我提取数据的方式?谢谢

Sam*_*ami 5

你可以使用像这样的窗口函数

Select T1.data, 
       T1.PMID  
FROM [dbo].[ADMIN_Publication_JSON] T1 INNER JOIN
     (SELECT Data,
             ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN
      FROM dbo.Split(@PMID,',')
     ) T2 ON  T1.PMID = T2.Data 
ORDER BY T2.RN;
Run Code Online (Sandbox Code Playgroud)

这是一个小样本:

CREATE TABLE T(
  ID INT,
  SomeValue VARCHAR(45)
);

INSERT INTO T VALUES
(1, 'One'),
(2, 'Two'),
(3, 'Three'),
(4, 'Four'),
(5, 'Five');

DECLARE @IDs VARCHAR(200) = '3,5,2';

SELECT T.*
FROM T INNER JOIN 
       (SELECT Value,
               ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) Seq
       FROM STRING_SPLIT(@Ids, ',') --instead of your function
       ) TT
       ON T.ID = TT.Value
ORDER BY TT.Seq;
Run Code Online (Sandbox Code Playgroud)

现场演示