这是我的分割功能:
CREATE FUNCTION [dbo].[Split2]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS
(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT
'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),1,CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))-1),
'UserId' = SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))+1,LEN(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)))
FROM Split
)
...我尝试运行此查询:
Declare @String1 nvarchar(max);
SET @String1 = '1$1,0$1,2$2,1$2,0$2,3$3,1$3,0$3,4$4,3$4'
SELECT data, UserId
FROM dbo.Split2(@String1, ',')
OPTION (maxrecursion 0)
它运行正常,但是当我传递超过4000个字符时,我收到此错误
传递给LEFT或SUBSTRING函数的长度参数无效。
然后我试着改变
@String NVARCHAR(4000)
分割函数中的到nvarchar(max)
;
然后显示
允许的最大值(4000)。
我如何实现这一点,我们非常感谢任何想法。我想要分割长度超过10000或20000个字符的字符串。
答案 0 :(得分:1)
将@String
参数类型更改为NVARCHAR(max)
,并在第一个bigint
中向{0}的SELECT
添加显式广播,因为CHARINDEX
返回
bigint 如果expressionToSearch是varchar(max),nvarchar(max)或者 varbinary(max)数据类型;否则, int 。
CREATE FUNCTION [dbo].[Split2]
(
@String NVARCHAR(max),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS
(
SELECT CAST(0 AS bigint) AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT
'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),1,CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))-1),
'UserId' = SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))+1,LEN(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)))
FROM Split
)
答案 1 :(得分:0)
SQL Server字符串限制为4000个Unicode字符,例如NVARCHAR(MAX)。这是你的错误的原因。
您可以将其更改为非Unicode,并且您将获得8000 VARCHAR(MAX)。
获取更多信息需要您以某种方式控制代码运行时字符串的大小。我不完全清楚它是如何工作的,所以我无法进一步修改它。