当然,您只需要跟踪每个项目在列表中的显示位置即可。一种方法是让您的拆分函数插入一
IDENTITY列。以我的回答从你引用的问题:
CREATE FUNCTION dbo.SplitStrings( @List NVARCHAr(MAX), @Delimiter NVARCHAr(255))RETURNS @t TABLE([Index] INT IDENTITY(1,1), Item NVARCHAr(255))ASBEGIN INSERT @t(Item) SELECt SUBSTRINg(@List, Number, CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number) FROM (SELECt ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects) AS n(Number) WHERe Number <= ConVERT(INT, LEN(@List)) AND SUBSTRINg(@Delimiter + @List, Number, 1) = @Delimiter ORDER BY Number OPTION (MAXDOP 1); RETURN;ENDGODECLARE @x TABLE(i INT, string NVARCHAr(4000));INSERT @x SELECt 1, N'field1;field2;field3;field4;field5;'UNIOn ALL SELECT 2, N'x;y;6;r;3;2;w;'UNIOn ALL SELECT 3, N'ttt;444;rrr;333;111;444;777;888;';SELECT x.i, s1.ItemFROM @x AS xCROSS APPLY dbo.SplitStrings(x.string, ';') AS s1WHERe s1.[Index] = 4;
内联替代方案,在规模上 可能 会 稍微 友好一些:
CREATE FUNCTION dbo.SplitStrings( @List NVARCHAr(MAX), @Delimiter NVARCHAr(255))RETURNS TABLEAS RETURN (SELECt [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item FROM (SELECt Number, Item = LTRIm(RTRIm(SUBSTRINg(@List, Number, CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number))) FROM (SELECt ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects) AS n(Number) WHERe Number <= ConVERT(INT, LEN(@List)) AND SUBSTRINg(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter ) AS y);GO
当然,最终您将需要修复架构。如果此列表中的第4个元素是重要数据,则应将其单独存储。



