例
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)
你的fnSplit()是否也返回一個序列號?如果是這樣,只需在您的WHERE後添加一個訂購單 –