SQL Server:基于偏移量值的逗号分隔列表

SQL Server:基于偏移量值的逗号分隔列表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,SQL查询如下所示: Declare @Values nvarchar(max) , @From int , @To int Set @Values = 'a,b,c,d,e,f,g,h,i,j' Set @From = 3 , @To = 7 必须根据@From和@To将值拆分为行。根据上述查询,需要的输出是 c d e f g 任何帮助都将不胜感激。为此您需要一个字符串拆分器。这是杰夫·摩登的作品 DECLARE @Values NVARCHAR(MAX), @From

SQL查询如下所示:

Declare @Values nvarchar(max) , @From int , @To int
Set @Values = 'a,b,c,d,e,f,g,h,i,j'
Set @From = 3 , @To = 7
必须根据@From和@To将值拆分为行。根据上述查询,需要的输出是

 c d e f g

任何帮助都将不胜感激。

为此您需要一个字符串拆分器。这是杰夫·摩登的作品

DECLARE @Values NVARCHAR(MAX),
        @From   INT,
        @To     INT

SELECT  @Values = 'a,b,c,d,e,f,g,h,i,j',
        @From   = 3, 
        @To     = 7

SELECT STUFF((
    SELECT ' ' + Item
    FROM dbo.DelimitedSplit8K(@Values, ',')
    WHERE ItemNumber BETWEEN @From AND @To
    FOR XML PATH('')
), 1, 1, '')

您可以使用以下查询:

declare @Values nvarchar(max) 
      , @From int 
      , @To int

set @Values = 'a,b,c,d,e,f,g,h,i,j'
set @From = 3
set @To = 7

;with cte as(
select substring(@Values, charindex(',', @Values, 1) + 1, 4000) as st
     , substring(@Values, 1, charindex(',', @Values, 1) - 1) ch
     , 1 as rn
union all
select substring(st, t + 1, 4000) as st
     , substring(st, 1, t - 1) ch
     , rn + 1 as rn
  from cte
    cross apply (select case when charindex(',', st, 1) = 0 then 8000 else charindex(',', st, 1) end) t(t)
  where rn < @To
    and datalength(st) > 0)

select stuff((
select ' ' + ch as 'text()'
  from cte
  where rn between @From and @To
  order by rn
  for xml path('')), 1, 1, '')
  option (maxrecursion 0)
免责声明:我是项目的所有者

如果你有C背景,你可以考虑这个库,让你在T-SQL

中直接使用C语法。
DECLARE @Values NVARCHAR(MAX) ,
    @From INT ,
    @To INT

SELECT  @Values = 'a,b,c,d,e,f,g,h,i,j' ,
        @From = 3 ,
        @To = 7

-- The index start at 0 and not at 1 in C#
DECLARE @sqlnet SQLNET = SQLNET::New('
values.Split('','').Skip(from - 1).Take(to - from + 1)')
.ValueString('values', @Values)
.Val('from', @From)
.Val('to', @to)

-- In multiple rows
SELECT  *
FROM    [dbo].[SQLNET_EvalTVF_1](@sqlnet)

-- In same rows
SELECT  SQLNET::New('
var splits = values.Split('','').Skip(from - 1).Take(to - from + 1).ToList();
return string.Join('' '',  splits);')
.ValueString('values', @Values)
.Val('from', @From)
.Val('to', @to)
.Eval()

这是有效的。以及如何获得逗号分隔列表中的值计数。选择DATALENGTH@Values/2 - DATALENGTHREPLACE@Values, ',', /2