在CTE遞歸測試,也就是部門名稱拼接的時候,遇到了小問題:
登時就迷糊了:不都是取的是Unit表中的同一個列,相加之后類型就變了么?
難道是因為,系統知道這是在進行遞歸運算,但又不確定遞歸的層次,以及字符串連接后的長度,於是把這個字符串的長度預設為很大很大的。
但是第一個例子中的Level也進行了運算,為什么就不需要顯示轉換類型?
這是因為遞歸也不是無限遞歸的,也是有層次限制的:
【在測試遞歸查詢的結果時,可以通過在 INSERT、UPDATE、DELETE 或 SELECT 語句的 OPTION 子句中使用 MAXRECURSION 提示和 0 到 32,767 之間的值,來限制特定語句允許的遞歸級數。】
而int 足夠了:(目測是int類型,因為var num=1, 默認的類型就是int)
Int:從 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型數據(所有數字)。存儲大小為 4 個字節
Int類型猜測正確, 但為什么錯誤提示是:溢出,而不是更多字節的bigint?
前面不是說了么:數值的默認類型是int,一旦確定就不會再改變。(而且這個環境還沒有智能到,根據所賦的值的大小,或者要進行的加減乘除的運算,自動匹配到最合適的類型。)於是乎,我茅塞頓開:字符串進行運算的時候,也是有默認類型的(Set是內置了轉換的)下面就是驗證:
所以這個問題就是CTE遞歸時,Union運算要求同結構,同類型; 而運算后的默認類型和自定義的類型不一致, 顯示轉換下就OK了, 選擇哪種轉換方式, 看具體需求。
參考:
http://bbs.csdn.net/topics/290079093
http://technet.microsoft.com/zh-cn/library/ms186243(v=sql.105).aspx