递归 CTE 中的字符串操作

Osc*_*car 6 sql-server cte recursive

我正在尝试进行以下工作:

WITH results(n, string ) AS (
            SELECT 1,'lol'
            UNION ALL
            SELECT n+1, string + ' lol'
            FROM results
            WHERE n<6
            )
            SELECT * FROM results
Run Code Online (Sandbox Code Playgroud)

但是 SQL 似乎无法识别第二列中的字符串连接并返回错误:

递归查询“结果”的“字符串”列中的锚点和递归部分之间的类型不匹配。

我想要的输出是这样的

1、哈哈

2、哈哈哈哈哈

3、哈哈哈哈哈

等等

Sab*_*n B 7

您可以根据需要将其转换为 varchar(2000) 或 varchar(max) ,因此两者都应具有相同的数据类型和大小
,值为 1,它使用整数/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
Run Code Online (Sandbox Code Playgroud)

您可以通过使用查看数据类型 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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

值/表达式的数据类型1可以通过以下方式检查:

select SQL_VARIANT_PROPERTY(1,'basetype')
int
Run Code Online (Sandbox Code Playgroud)