有没有办法循环记录集并识别不同的值?

时间:2017-02-27 19:09:51

标签: sql-server stored-procedures cursor

我有一个MS SQL存储过程,它使用游标循环select语句的记录。当我循环并读取每条记录时,它可以是3然后是3然后是3或者它可以是3然后是4然后是5然后3.它可以是一条记录或多条记录。

我需要知道的是,所有的值是相同还是不同?我不在乎它们是什么,只要它们是相同或不同的。如果我使用客户端代码执行此操作,我会使用一个列表,看看该值是否在列表中,然后当我完成时,我会计算值,如果一个值相同,如果大于1然后不同。

       DECLARE TC CURSOR LOCAL
             FOR SELECT ProgramID FROM tblPublications
              OPEN TC
              FETCH NEXT FROM TC INTO @ProgramID
              WHILE @@FETCH_STATUS = 0
              BEGIN
              Print @ProgramID
               --Same or Different then the last one???


              FETCH NEXT FROM TC2 INTO @ProgramID
              END
              CLOSE TC
              DEALLOCATE TC
        END

如果它们是相同的,那么我将以一种方式更新记录,如果它们不同,则以另一种方式更新状态记录。

谢谢

3 个答案:

答案 0 :(得分:2)

这样的事情(不涉及光标)也许?

select PubId, count(distinct ProgId) 
from tblPublications
group by PubId

答案 1 :(得分:2)

您可以使用count(distinct col)获取列的不同值的数量,并使用case表达式返回值,具体取决于它是否为1。

select 
    PublicationId
  , PublicationType = case 
      when count(distinct ProgramId) > 1 
        then 'inter' 
      else 'intra' 
      end
from  tblPublications
where PublicationId = 12345
group by PublicationId

答案 2 :(得分:0)

您可以比较组中ProgramID的最小值和最大值。 如果所有值都相同,则最大值将与最小值相同。

;with tblPublications(ProgramID,ID)AS(
select 'a',1 union 
select 'b',1 union
select 'c',2 union
select 'c',2

select case when ISNULL(max(ProgramID),'')=ISNULL(min(ProgramID),'') then 'Same' else 'Different' end   
from tblPublications
group by ID
    (No column name)
1   Different
2   Same