1. 程式人生 > 實用技巧 >sqlserver CTE定位點型別和遞迴部分的型別不匹配

sqlserver CTE定位點型別和遞迴部分的型別不匹配

【1】字串型別遞迴報錯

在CTE遞迴測試,遇到了小問題:

  

登時就迷糊了:不都是取的是Unit表中的同一個列,相加之後型別就變了麼?

難道是因為,系統知道這是在進行遞迴運算,但又不確定遞迴的層次,以及字串連線後的長度,於是把這個字串的長度預設為很大很大的。

例子1:

;with t1(id ,num1 ) as (
select 1 ,1
union all 
select id+1,id+id*10 from t1
where id<=10
)
  

但是上面例子中的 num 1也進行了運算,為什麼就不需要顯示轉換型別?

【2】錯誤情況

  、

  

【2】分析

這是因為遞迴也不是無限遞迴的,也是有層次限制的:

【在測試遞迴查詢的結果時,可以通過在 INSERT、UPDATE、DELETE 或 SELECT 語句的 OPTION 子句中使用 MAXRECURSION 提示和 0 到 32,767 之間的值,來限制特定語句允許的遞迴級數。】

而int 足夠了:(目測是int型別,因為直接寫一個數字, 預設的型別就是int)

Int從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型資料(所有數字)。儲存大小為 4 個位元組

  

Int型別猜測正確, 但為什麼錯誤提示是:溢位,而不是更多位元組的bigint?

前面不是說了麼:數值的預設型別是int,一旦確定就不會再改變。(而且這個環境還沒有智慧到,根據所賦的值的大小,或者要進行的加減乘除的運算,自動匹配到最合適的型別。)

於是乎,我茅塞頓開:字串進行運算的時候,也是有預設型別的(字串運算,預設就會把字串轉換成 varchar(8000) )下面就是驗證:

  

所以這個問題就是CTE遞迴時,Union運算要求同結構,同類型;

而運算後的預設型別和自定義的型別不一致, 顯示轉換下就OK了, 選擇哪種轉換方式, 看具體需求。

參考:

http://bbs.csdn.net/topics/290079093

http://technet.microsoft.com/zh-cn/library/ms186243(v=sql.105).aspx

https://www.cnblogs.com/ccding13/p/3515393.html