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、哈哈哈哈哈
等等
您可以根据需要将其转换为 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)
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |