Sql-Server
遞歸 CTE 中的字元串操作
我正在嘗試進行以下工作:
WITH results(n, string ) AS ( SELECT 1,'lol' UNION ALL SELECT n+1, string + ' lol' FROM results WHERE n<6 ) SELECT * FROM results
但 SQL 似乎無法辨識第二列中的字元串連接並返回錯誤:
遞歸查詢“結果”的“字元串”列中的錨點和遞歸部分之間的類型不匹配。
我想要的輸出將類似於
1,哈哈
2、哈哈哈哈哈
3、哈哈哈哈哈
等等
您可以根據需要將其轉換為 varchar(2000) 或 varchar(max) ,因此兩者都應該具有相同的數據類型和值 1 的大小
,它使用 integer/int 數據類型
來自與 CTE 相關的BOL ,
- 遞歸成員中某一列的數據類型必須與錨成員中對應列的數據類型相同。
WITH results(n, string ) AS ( SELECT 1,CAST('lol' as varchar(2000)) UNION ALL SELECT n+1, CAST(string + ' lol' as varchar(2000)) FROM results WHERE n<6 ) SELECT * FROM results
您可以通過使用查看數據類型
SQL_VARIANT_PROPERTY
WITH results(n, string, expressionType1, expressionType2) AS ( SELECT 1,cast('lol' as varchar(2000)), SQL_VARIANT_PROPERTY(1, 'BaseType'), SQL_VARIANT_PROPERTY(cast('lol' as varchar(2000)), 'MaxLength') UNION ALL SELECT n+1, cast(string + ' lol' as varchar(2000)) , SQL_VARIANT_PROPERTY(n+1, 'BaseType'), SQL_VARIANT_PROPERTY(cast(string + ' lol' as varchar(2000)), 'MaxLength') FROM results WHERE n<6 ) SELECT * FROM results
輸出:
n string expressionType1 expressionType2 1 lol int 2000 2 lol lol int 2000 3 lol lol lol int 2000 4 lol lol lol lol int 2000 5 lol lol lol lol lol int 2000 6 lol lol lol lol lol int 2000
值/表達式的數據類型
1
可以通過以下方式檢查:select SQL_VARIANT_PROPERTY(1,'basetype') int