Из комментария KM выше ...
Я знаю, что вы не утверждали, что он разделен запятой, но если это CSV или даже если у вас есть разделенный пробелом, вы могли бы сделать следующее.
DECLARE @SomeTest varchar(100) --used to hold your values
SET @SomeTest = (SELECT '68,72,103') --just some test data
SELECT
LoginID --change to your column names
FROM
Login --change to your source table name
INNER JOIN
( SELECT
*
FROM fn_IntegerInList(@SomeTest)
) n
ON
n.InListID = Login.LoginID
ORDER BY
n.SortOrder
И затем создайте fn_IntegerInList()
:
CREATE FUNCTION [dbo].[fn_IntegerInList] (@InListString ntext)
RETURNS @tblINList TABLE (InListID int, SortOrder int)
AS
BEGIN
declare @length int
declare @startpos int
declare @ctr int
declare @val nvarchar(50)
declare @subs nvarchar(50)
declare @sort int
set @sort=1
set @startpos = 1
set @ctr = 1
select @length = datalength(@InListString)
while (@ctr <= @length)
begin
select @val = substring(@InListString,@ctr,1)
if @val = N','
begin
select @subs = substring(@InListString,@startpos,@ctr-@startpos)
insert into @tblINList values (@subs, @sort)
set @startpos = @ctr+1
end
if @ctr = @length
begin
select @subs = substring(@InListString,@startpos,@ctr-@startpos)
insert into @tblINList values (@subs, @sort)
end
set @ctr = @ctr +1
set @sort = @sort + 1
end
RETURN
END
Таким образом, ваша функция создает таблицу, которая содержит порядок сортировки, а именно SortOrder
и идентификатор или номер, который вы передаете.Конечно, вы можете изменить это так, чтобы вы искали пробел
вместо ,
значений.В противном случае Мартин имеет правильную идею в своем ответе.Обратите внимание, что в моем примере я использую одну из моих таблиц, поэтому вам нужно изменить имя Login
на любое, с чем вы имеете дело.