【问题标题】:Cursor in stored procedure存储过程中的光标
【发布时间】:2011-10-24 07:36:38
【问题描述】:

我有这样的表:

id number value
1    300   233
2    343   434
2    565   655
3    562   343
1    434   232
3    232   444
3    458   232

应该是的

id number:value, number:value...
1   300:233, 434:232
2   343:434, 565:655

... 等等

基本上,我必须为每个 ID 合并第 2 列和第 3 列和组。

我所做的是 CAST,我得到了“合并”的第 2 列和第 3 列,现在我需要按 id 对 id 进行分组,以获取未知数量的 id(不能手动执行 id)。

所以,我用 2 行创建了一个新的,而不是原来的 3 列表

id number:value
1    300:233
2    343:434
2    565:655
3    562:343
1    434:232
3    232:444
3    458:232

只需要以某种方式对其进行分组,以获得我需要的输出。我确信它可以用光标来完成,但我可以做到。

提前感谢您的帮助。

【问题讨论】:

标签: sql sql-server tsql stored-procedures cursor


【解决方案1】:

如果您使用的是 SQL 2008,以下将在不使用游标的情况下工作:

DECLARE @t TABLE
    (
      id INT
    , number INT
    , VALUE INT
    )

INSERT  INTO @t
        ( id, number, VALUE )
VALUES  ( 1, 300, 233 ),
        ( 2, 343, 434 ),
        ( 2, 565, 655 ),
        ( 3, 562, 343 ),
        ( 1, 434, 232 ),
        ( 3, 232, 444 ),
        ( 3, 458, 232 )


SELECT  DISTINCT ID
      , STUFF(( SELECT  ',' + CONVERT(VARCHAR(10), number) + ':'
                        + CONVERT(VARCHAR(10), VALUE)
                FROM    @t i
                WHERE   t.ID = i.ID
              FOR
                XML PATH('')
              ), 1, 1, '') AS [number:value]
FROM    @t t

【讨论】:

    【解决方案2】:
    GO
    -- Declare the variables to store the values returned by FETCH.
    DECLARE @Number varchar(50);
    DECLARE @Value varchar(50);
    
    DECLARE number_cursor CURSOR FOR
    select  Number, Value FROM [table_name] for update of Numbervalue
    
    OPEN number_cursor;
    
    FETCH NEXT FROM number_cursor
    INTO @Number, @Value;
    
    WHILE @@FETCH_STATUS = 0
    BEGIN   
        UPDATE [table_name]
        SET Numbervalue ='@Number'+'@Value' where current of number_cursor    
       FETCH NEXT FROM number_cursor
       INTO @Namber,@Value;
    END
    
    CLOSE number_cursor;
    DEALLOCATE number_cursor;
    GO
    

    【讨论】:

    • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上以很好地格式化和语法突出显示它!
    • 那里的 Numbervalue 是什么?如果我不够清楚,那就是 MS SQL。谢谢。
    • 只是因为它可以在游标中完成并且 OP 请求了游标,但这并不意味着它是答案的最佳选择。此任务不需要游标,也不应该使用。
    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2016-08-20
    • 2013-09-26
    相关资源
    最近更新 更多