如果您无法添加计数表(Zohar Peled 说明的方式),您可以使用临时计数表
Declare @Str varchar (15) = '0123456789'
Select Num=substring(@Str,N,1)
From (Select Top (Len(@Str)) N=Row_Number() Over (Order By (Select null)) From master..spt_values ) N
返回
Num
0
1
2
3
4
5
6
7
8
9
另一种选择是创建 TVF
Declare @Str varchar (15) = '0123456789'
Select * from [dbo].[udf-Str-Parse-Char](@Str)
UDF
CREATE FUNCTION [dbo].[udf-Str-Parse-Char] (@String varchar(max))
Returns Table
As
Return (
with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d,cte1 e,cte1 f)
Select RetSeq=N
,RetVal=Substring(@String,N,1)
From cte2
)
--Max 1 Million Observations
--Select * from [dbo].[udf-Str-Parse-Char]('this is a string')