2017-03-08 69 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)