【问题标题】:cte recursion error don't match between anchorcte 递归错误在锚点之间不匹配
【发布时间】:2018-02-26 13:43:36
【问题描述】:

这可能是我理解数据类型的错误,但是...... 我收到此错误

消息 240,第 16 级,状态 1,第 7 行 递归查询“系列”的“编号”列中的锚点和递归部分的类型不匹配。

使用此代码

WITH Series AS 
( 
  SELECT CAST(-5 AS Decimal(5, 2)) AS Number 
  UNION ALL 
  SELECT CAST(-5 AS Decimal(5, 2)) + 0.5   AS Number
  FROM Series 
  WHERE Number  <= CAST(5 AS Decimal(5, 2))
) 
SELECT  * 
Number, 
ROW_NUMBER() OVER(ORDER BY Number ASC) AS id
FROM Series 
OPTION (MAXRECURSION 21);

我的目标是有一系列从 -5 到 5 的数字,间隔为 0.5

【问题讨论】:

  • 您使用的是哪个 dbms?
  • Microsoft SQL Server 2016 (SP1-CU7-GDR) (KB4057119)

标签: sql sql-server recursion common-table-expression sql-server-2016


【解决方案1】:

你只是犯了几个错误

WITH Series AS 
( 
  SELECT CAST(-5 AS Decimal(5, 2)) AS Number 
  UNION ALL 
  SELECT CAST((number + 0.5) AS Decimal(5, 2))    AS Number
  FROM Series s
  WHERE s.Number  <= 4.5
) 
SELECT  Number, 
      ROW_NUMBER() OVER(ORDER BY Number ASC) AS id
FROM Series 

dbfiddle demo

【讨论】:

  • 该死的家伙!很快谢谢你,我发现我在错误的事情上找到了错误的方法。
【解决方案2】:

我经常使用表值函数来创建动态范围。易于使用独立或合并到 CROSS APPLY 或任何其他子查询中。

示例

Select * from [dbo].[tvf-Range-Number](-5,5,.5)

返回

RetSeq  RetVal
1       -5.00
2       -4.50
3       -4.00
4       -3.50
....
17       3.00
18       3.50
19       4.00
20       4.50
21       5.00

有兴趣的 UDF

CREATE FUNCTION [dbo].[tvf-Range-Number] (@R1 money,@R2 money,@Incr money)
Returns Table
Return (
    with cte0(M) As (Select cast((@R2-@R1)/@Incr as int)),
         cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
         cte2(N) As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a,cte1 b,cte1 c,cte1 d,cte1 e,cte1 f,cte1 g,cte1 h )

    Select RetSeq=1,RetVal=@R1 Union All Select N+1,(N*@Incr)+@R1
    From   cte2   
)
-- Max 100 million observations 
-- Select * from [dbo].[tvf-Range-Number](0,4,0.25)

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多