为什么这个用于分割字符串的SQL使用逗号分隔的字符串而不是空格分隔的字符串?

时间:2017-08-17 12:10:07

标签: sql sql-server common-table-expression

使用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', ' ');

1 个答案:

答案 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。但是,由于这是NVARCHARDATALENGTH函数将返回字符数* 2,因此您需要将结果除以2:

@ld INT = DATALENGTH(@Delimiter)/2;

See a live demo on rextester.