SQL查询看起来是这样的: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
任何帮助,将不胜感激。
SQL查询看起来是这样的: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
任何帮助,将不胜感激。
免责声明:我是这个项目的所有者Eval SQL.NET
如果你有一个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()
为此,您需要一个字符串分隔符。这里是Jeff Moden的DelimitedSplit8k。
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)
这是工作。而且我怎样才能得到在逗号分隔列表中的值的数量。 –
'SELECT DATALENGTH(@Values)/ 2 - DATALENGTH(REPLACE(@Values,',',''))/ 2' –