Sql-Server

遞歸 CTE 中的字元串操作

  • February 26, 2021

我正在嘗試進行以下工作:

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

引用自:https://dba.stackexchange.com/questions/286075