Sql 使用fn split插入时防止自动排序

Sql 使用fn split插入时防止自动排序,sql,tsql,Sql,Tsql,正确插入,但在插入时对id进行排序 如果执行存储过程参数username=dynamic和id=19,1,10 然后,当我检查收藏夹表时,我看到: 有关拆分函数的更多信息: 注意:我对函数使用了不同的名称,但它是相同的示例 返回 提供序列RetSeq的TVF 我相信你内心的结合正在改变秩序。由于您仅将其用于筛选,因此可以将内部联接更改为where exists。这应维持秩序: INSERT INTO Favorites( username, id ) SELECT @username, i.

正确插入,但在插入时对id进行排序

如果执行存储过程参数username=dynamic和id=19,1,10 然后,当我检查收藏夹表时,我看到:

有关拆分函数的更多信息: 注意:我对函数使用了不同的名称,但它是相同的

示例

返回

提供序列RetSeq的TVF

我相信你内心的结合正在改变秩序。由于您仅将其用于筛选,因此可以将内部联接更改为where exists。这应维持秩序:

INSERT INTO Favorites( username, id )
SELECT  @username, i.item
FROM fnSplit(@id, ',') i
WHERE EXISTS
(
   SELECT 1
   FROM dbo.Link f
   WHERE f.id = i.item AND f.id IS NOT NULL
)

fnSplit是否也返回序列号?如果是这样的话,只需在Where之后添加一个Order By感谢您的帮助,删除join解决了这个问题!
Declare @username varchar(50) = 'dynamic'
Declare @favorite varchar(50) = '19,1,10'

Insert Into Favorites (username,id) 
Select @username,f.ID
 From  [dbo].[udf-Str-Parse](@favorite,',') i
 Join  dbo.Link f on f.id = i.RetSeq
 Where f.ID is not null
 Order By RetSeq                  -- << Notice we added an Order By
Select * From  [dbo].[udf-Str-Parse]('19,1,10',',')
RetSeq  RetVal
1       19
2       1
3       10
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From  (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')
--Performance On a 5,000 random sample -8K 77.8ms, -1M 79ms (+1.16), -- 91.66ms (+13.8)
INSERT INTO Favorites( username, id )
SELECT  @username, i.item
FROM fnSplit(@id, ',') i
WHERE EXISTS
(
   SELECT 1
   FROM dbo.Link f
   WHERE f.id = i.item AND f.id IS NOT NULL
)