【问题标题】:TSQL WITH and CURSORTSQL WITH 和 CURSOR
【发布时间】:2026-01-07 10:10:02
【问题描述】:

想要将最后一个选择语句设置为 CURSOR

DECLARE @wec_AIMKEY     numeric(17,5)
DECLARE @wec_IDENT      varchar(15)
DECLARE @wec_QUANTITY   numeric(20,2)
DECLARE @wec_BOM_UNIT   varchar(30)
DECLARE @wec_Sort       varchar(max)

DECLARE @wecMother_AIMKEY   numeric(17,5)
set @wecMother_AIMKEY = 2158310.24613

DECLARE @wecSearchIDENT     varchar(15)
set @wecSearchIDENT = '0712712';

-- ACHTUNG: der ; ist Wichtig ansonsten funktioniert die WITH nicht

-- Es werden alle Artikel Positionen gesucht
WITH Tree (X_PARENT_AIMKEY, AIMKEY, CATEGORY, X_POSITION, X_QUANTITY, BOM_UNIT, IDENT, SHORT_DESC, MATERIAL, STATUSKEY, CREATE_DATE, Depth, Sort) 
AS 
    ( 
        SELECT X_PARENT_AIMKEY, AIMKEY, CATEGORY, X_POSITION, X_QUANTITY, BOM_UNIT, IDENT, SHORT_DESC, MATERIAL, STATUSKEY, CREATE_DATE, 0 AS Depth, CONVERT(varchar(1000), X_PARENT_AIMKEY) AS Sort 
        FROM VIEW_XREF_CHILD_PART 
        where X_PARENT_AIMKEY = @wecMother_AIMKEY
        UNION ALL 
        SELECT CT.X_PARENT_AIMKEY, CT.AIMKEY, CT.CATEGORY, CT.X_POSITION, CT.X_QUANTITY, CT.BOM_UNIT, CT.IDENT, CT.SHORT_DESC, CT.MATERIAL, CT.STATUSKEY, CT.CREATE_DATE, Parent.Depth + 1 AS Depth, 
        CONVERT(varchar(1000), Parent.Sort + '|' + CONVERT(varchar(1000),CT.X_PARENT_AIMKEY)) AS Sort 
        FROM VIEW_XREF_CHILD_PART CT 
        INNER JOIN Tree as Parent ON Parent.AIMKEY = CT.X_PARENT_AIMKEY 
    )

-- DECLARE wec_cr_quantity_sum CURSOR local forward_only read_only static FOR
-- ALL Positions                      
SELECT AIMKEY, IDENT, X_QUANTITY , BOM_UNIT, Sort
FROM Tree 
where IDENT = @wecSearchIDENT
ORDER BY IDENT

==> DECLARE wec_cr_quantity_sum CURSOR local forward_only read_only static FOR 剂量工作

有什么想法可以创建它吗?

【问题讨论】:

  • muss ich gleich mal fragen: ist der Cursor wirklich notig? ist er fast nie und ein statement kanns auch, aber viel schneller.
  • 不要试图弄清楚如何使用光标来执行此操作 - 您应该弄清楚如何在没有光标的情况下执行此操作!
  • @marc_s:说出需要使用游标的情况。我想我有一个......
  • @DerU:对我来说唯一有效的原因是如果您需要为结果集的每一行执行存储过程
  • @marc_s:但存储过程操作可能会集成到语句中?! (我每晚都进行索引维护。我用所有碎片级别超过阈值的索引名称填充游标,然后执行带有重建/重组的动态 sql 语句。)

标签: sql-server tsql cursor with-statement


【解决方案1】:

必须使用与进入它们的列相同的数据类型来声明变量。

DECLARE cur CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR
 SELECT AIMKEY, IDENT, X_QUANTITY , BOM_UNIT, Sort
 FROM Tree 
 where IDENT = @wecSearchIDENT
  OPEN cur
  FETCH NEXT FROM cur
  INTO @var_AIMKEY,@var_IDENT,@var_X_QUANTITY,@var_BOM_UNIT,@var_Sort
   WHILE (@@FETCH_STATUS = 0)
    BEGIN
    ... --do stuff with the variables
    FETCH NEXT FROM cur
    INTO @var1,@var2,@var3,@var4,@var5
    END
  CLOSE cur
  DEALLOCATE cur

请注意,游标非常慢。在大多数情况下,可以构建满足逻辑要求的语句,并且数据库引擎可以更快地运行它。

【讨论】: