2017-03-08 77 views
2

插入正确自动排序,然而如果予执行存储过程参数的用户名=动态和id = 19,1,10 然后当我检查收藏表I排序ID,同时插入防止当与FN插入分裂

见:

enter image description here

INSERT INTO Favorites(username, id) 
SELECT @username, i.item 
FROM fnSplit(@id, ',') i 
INNER JOIN dbo.Link f on f.id = i.item 
WHERE id IS NOT NULL 
约拆分功能

的更多信息: https://msdn.microsoft.com/en-us/library/mt684588.aspx 注:我使用的是不同的NA我要的功能,但它是一回事

+0

你的fnSplit()是否也返回一个序列号?如果是这样,只需在您的WHERE后添加一个订购单 –

回答

1

我相信你inner join正在改变顺序。由于您只使用它进行过滤,因此您可以将inner join更改为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 
) 
+0

感谢您的帮助,删除联接解决了这个问题! – DynamicallyLinear

0

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 

这将提供一个序列的TVF(RetSeq)

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)