使用this blog post的公用表表达式部分中提供的SQL函数(为方便起见,下面复制了),我可以将逗号分隔的字符串拆分为包含字符串每个部分的表。
ret = odeint(deriv, y0, t, args=(N1, B, a, d, g, z, M))
在几分之一秒内运行并返回预期结果。但是,如果我将分隔符从逗号更改为空格,SELECT * FROM dbo.SplitStrings_CTE('a,b,c', ',');
似乎永远不会完成执行。我一直试图理解这个功能是如何工作的,但是这个方面让我很难过。为什么它似乎无法使用空格作为分隔符?
功能是:
SELECT * FROM dbo.SplitStrings_CTE('a b c', ' ');
答案 0 :(得分:3)
原因如下:
@ld INT = LEN(@Delimiter);
在Sql Server中,LEN
忽略尾随空格 - 当只有一个空格时,LEN
将返回0
:
SELECT LEN(',') As [LEN(',')],
LEN(N' ') As [LEN(N' ')],
LEN(N' 1') As [LEN(N' 1')],
LEN(N'1 ') As [LEN(N'1 ')]
返回:
LEN(',') LEN(N' ') LEN(N' 1') LEN(N'1 ')
1 0 2 1
要解决此问题,您可以使用DATALENGTH
。但是,由于这是NVARCHAR
,DATALENGTH
函数将返回字符数* 2,因此您需要将结果除以2:
@ld INT = DATALENGTH(@Delimiter)/2;