2016-02-04 58 views
0

我編寫了一個CTE代碼,可以將分隔字符串(分隔符可以是任意)解析到表中。所以「MI,TX,WI」將被解析成一個有3行的表格。SQL Server CTE錯誤:類型在錨點和遞歸部分之間不匹配

只要我不使用NVARCHAR(MAX)作爲我想要解析的字符串輸入,它就會工作。

我想知道我怎樣才能得到它與NVARCHAR(MAX)工作(或最起碼VARCHAR(MAX)

這個工程除了對此事發表評論,如果你改變你得到這個錯誤:

Types don't match between the anchor and the recursive part in column "b" of recursive query "cte".

--- change this to NVARCHAR(MAX) and it fails 
DECLARE @DelimitedString NVARCHAR(4000) 
DECLARE @Delimiter NVARCHAR(10) 
SET @Delimiter = '--' 

SET @DelimitedString= '123--456--7890, 234--456--7890' 

-- do here instead of in every loop below 
DECLARE @DelimiterLength AS TINYINT 
SET @DelimiterLength = len(@Delimiter) 

;with cte as 
( 
    select 0 a, 1 b 
    union all 
    select b, charindex(@Delimiter, @DelimitedString, b) + len(@Delimiter)  
    from cte where b > a 
) 
select LTRIM(RTRIM(
    SUBSTRING(@DelimitedString, 
     a,     
     case when b > @DelimiterLength then [email protected] else len(@DelimitedString) - a + 1 end 
    )--END SUBSTRING 
))--end LTRIM/RTRIM 
value   
from cte where a > 0 

我明白標準中的錯誤含義,UNION數據類型中的列必須匹配。我看不到如何解決問題。

我希望它能夠處理我們需要的字符串,因爲我不知道該用法是否會限制爲4000個字符的字符串。

+0

嘗試鑄造B中的CTE的上半部分的'int'。 –

+0

有一些比ctes更好的分割字符串的方法。以下是一篇專門介紹各種分離器的文章,以及它們如何提高性能。沒有必要在這裏重新發明輪子。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

回答

2

CHARINDEX()VARCHAR(MAX)而不是INT使用時返回BIGINT所以你需要錨類型也BIGINT

;with cte as ( 
    select cast(0 as bigint) a, cast(1 as bigint) b