SQL Server中函数/过程中的游标

时间:2012-07-16 12:50:03

标签: sql sql-server-2008 cursor

我想知道SQL Server中是否可以使用以下内容 - 它涉及游标使用,我不确定如何将其置于函数内部或存储过程。

你会推荐什么?

TABLEA包含以下列:

Column1, Column2

实施例

Column1 Column2
------- -------
anna     a
anna     b
ben      b
john     c
john     b
john     a 

第2列中的可能值为:a,b和c(Column1上的某个值没有重复)

创建TABLEB结构:Column1 Column3 Column4 Column5.

  1. 让游标循环遍历TABLEA
  2. 的所有行
  3. SELECT * FROM TABLEB WHERE Column1 = (cursor row).Column1
  4. 如果以前的选择没有返回任何行, 在TABLEB中插入一行Column1 = (cursor row).Column1,在第3列,第4列和第5列上插入NULL值。

    If(从前一个选择返回的行)> 0:

    { 如果TABLEB.Column3不为null,则使用(游标行).Column2

    更新TABLEB

    否则如果TABLEB.Column4不为null,则使用(游标行)更新TABLEB .Column2

    否则如果TABLEB.Column5不为null,则使用(游标行)更新TABLEB .Column2 }

  5. END光标循环

  6. 如您所见,我非常清楚我想做什么,但语法很少或者在这种情况下建议使用什么。

    输出应该在以下步骤之后:

    Column1 Column3 Column4 Column5
    ------  ------- ------- -------
    anna    a        b       
    ben     b            
    john    c        b       a
    

    我最感兴趣的是如果可以使用游标,如果有的话,你有学习语法的提示/教程,你建议我将这个例子集成到一个过程/函数中吗?

    谢谢!

    LATER EDIT:

    podiluska,我尝试使用一个支点,如下所示:

    CREATE VIEW VIEWB
    AS SELECT [Column1], 
    ('Column2') AS [Source],
    MAX( CASE Column2 WHEN 'a' THEN Column2 ELSE '' END ) Column3,         
    MAX( CASE Column2 WHEN 'b' THEN Column2 ELSE '' END ) Column4,         
    MAX( CASE Column2 WHEN 'c' THEN Column2 ELSE '' END ) Column5          
    FROM TABLEA
    GROUP BY [Column1];
    GO 
    

    该方法的问题在于输出是:

    Column1 Column3 Column4 Column5
    ------  ------- ------- -------
    anna    a        b       
    ben              b            
    john    a        b       c
    

    您会注意到与第一个和所需输出的区别。

2 个答案:

答案 0 :(得分:2)

您可以使用光标,但我建议使用PIVOT 即:

 select column1, 
      case a when 0 then null else 'a' end,
      case b when 0 then null else 'b' end,
      case c when 0 then null else 'c' end
 from
      TableA as p
 pivot
      (Count(column2) for column2 in ([a],[b],[c]))
 as pt

如果你想换列,试试这个......

 select column1,
      case when c3 is null then c4 else c3 end c3,
      case when c3 is null then c5 else c4 end c4,
      case when c3 is null then null else c5 end c5
 from
 (
 select column1,
    case when c3 is null then c4 else c3 end c3,
    case when c3 is null then c5 else case when c4 is null then c5 else c4 end end c4,
    case when c3 is null or c4 is null then null else c5 end c5
 from
 (
 select column1, 
    case a when 0 then null else 'a' end c3,
    case b when 0 then null else 'b' end c4,
    case c when 0 then null else 'c' end c5
 from
    #temp as p
 pivot
    (Count(column2) for column2 in ([a],[b],[c]))
 as pt
 ) v
 ) v2

答案 1 :(得分:0)

根本不需要光标。这很容易

select 
    column1,
    max(case when column2='a' then column2  end) as column1,
    max(case when column2='b' then column2  end) as column2,
    max(case when column2='c' then column2  end) as column3
from
    table
group by
    column1