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

为什么拆分字符串的SQL使用逗号分隔的字符串而不是空格分隔的字符串?,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,为了方便起见,我可以使用下面复制的Common Table Expression部分中提供的SQL函数,将逗号分隔的字符串拆分为包含字符串每个部分的表 从dbo.SplitStrings_CTE'a,b,c','中选择*;在几分之一秒内运行并返回预期结果。但是,如果我将分隔符从逗号改为空格,请选择*from dbo.SplitStrings_CTE'abc','';似乎永远不会完成执行。我一直试图理解函数是如何工作的,但这方面的问题让我感到困惑。为什么它似乎无法处理使用空格作为分隔符的问题 功能

为了方便起见,我可以使用下面复制的Common Table Expression部分中提供的SQL函数,将逗号分隔的字符串拆分为包含字符串每个部分的表

从dbo.SplitStrings_CTE'a,b,c','中选择*;在几分之一秒内运行并返回预期结果。但是,如果我将分隔符从逗号改为空格,请选择*from dbo.SplitStrings_CTE'abc','';似乎永远不会完成执行。我一直试图理解函数是如何工作的,但这方面的问题让我感到困惑。为什么它似乎无法处理使用空格作为分隔符的问题

功能是:

CREATE FUNCTION dbo.SplitStrings_CTE
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS @Items TABLE (Item NVARCHAR(4000))
WITH SCHEMABINDING
AS
BEGIN
   DECLARE @ll INT = LEN(@List) + 1, @ld INT = LEN(@Delimiter);

   WITH a AS
   (
       SELECT
           [start] = 1,
           [end]   = COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, 1), 0), @ll),
           [value] = SUBSTRING(@List, 1, 
                     COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, 1), 0), @ll) - 1)
       UNION ALL
       SELECT
           [start] = CONVERT(INT, [end]) + @ld,
           [end]   = COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, [end] + @ld), 0), @ll),
           [value] = SUBSTRING(@List, [end] + @ld, 
                     COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, [end] + @ld), 0), @ll)-[end]-@ld)
       FROM a
       WHERE [end] < @ll
   )
   INSERT @Items SELECT [value]
   FROM a
   WHERE LEN([value]) > 0
   OPTION (MAXRECURSION 0);

   RETURN;
END
GO
原因如下:

@ld INT = LEN(@Delimiter);
在Sql Server中,LEN忽略尾随空格-当只有一个空格时,它的LEN将返回0:

返回:

LEN(',')    LEN(N' ')   LEN(N' 1')  LEN(N'1 ')
1           0           2           1
要解决此问题,可以使用DATALENGTH。但是,由于这是NVARCHAR,DATALENGTH函数将返回字符数*2,因此需要将结果除以2:

@ld INT = DATALENGTH(@Delimiter)/2;
原因如下:

@ld INT = LEN(@Delimiter);
在Sql Server中,LEN忽略尾随空格-当只有一个空格时,它的LEN将返回0:

返回:

LEN(',')    LEN(N' ')   LEN(N' 1')  LEN(N'1 ')
1           0           2           1
要解决此问题,可以使用DATALENGTH。但是,由于这是NVARCHAR,DATALENGTH函数将返回字符数*2,因此需要将结果除以2:

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

标记您正在使用的dbms。该代码是特定于产品的。也许是sql server?很好,谢谢。我正在使用的确实是SQL server。可能bec len'=0标记您正在使用的dbms。该代码是特定于产品的。也许是sql server?很好,谢谢。我正在使用的确实是SQL server。可能bec len'=0 len忽略了尾随空格-我从来都不知道这一点,突然之间一切都变得有意义了!谢谢。LEN忽略了尾随空格-我从来都不知道,突然之间一切都变得有意义了!谢谢