Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有一种方法可以循环记录集并识别不同的值?_Sql Server_Stored Procedures_Cursor - Fatal编程技术网

Sql server 有没有一种方法可以循环记录集并识别不同的值?

Sql server 有没有一种方法可以循环记录集并识别不同的值?,sql-server,stored-procedures,cursor,Sql Server,Stored Procedures,Cursor,我有一个MS SQL存储过程,它使用游标循环select语句的记录。当我循环并读取每条记录时,它可能是3,然后是3,然后是3,也可能是3,然后是4,然后是5,然后是3。它可以是一张唱片,也可以是多张唱片 我需要知道的是,所有的价值观是相同的还是不同的?我不在乎它们是什么,只要它们相同或不同。如果我在客户端代码中这样做的话,我会使用一个列表,看看这个值是否在列表中,然后当我完成时,我会计算这些值,如果一个,那么相同,如果超过1,那么不同 DECLARE TC CURSOR LOCAL

我有一个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
如果它们相同,则我将以一种方式更新记录,如果它们不同,则以另一种方式更新状态记录


谢谢

像这样的东西也许不涉及光标

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

像这样的东西可能不涉及光标

select PubId, count(distinct ProgId) 
from tblPublications
group by PubId
您可以使用countdistinct col获取列的不同值的数量,并根据值是1还是更多,使用case表达式返回值

select 
    PublicationId
  , PublicationType = case 
      when count(distinct ProgramId) > 1 
        then 'inter' 
      else 'intra' 
      end
from  tblPublications
where PublicationId = 12345
group by PublicationId
您可以使用countdistinct col获取列的不同值的数量,并根据值是1还是更多,使用case表达式返回值

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

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

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


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

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


也许有一种更好的方法可以不用循环或游标来完成您正在做的事情。您是否可以进一步阐述您的问题?我们不希望在sql中计算值时使用循环。我们使用聚合。比如countYourValue。给我们一些关于数据和期望输出的实际细节,我们可以提供帮助。这是一个很好的起点。我有一份属于不同部门作者的出版物清单。如果所有作者来自同一部门,则该出版物被视为部门内出版物。如果多个部门参与了该出版物的写作,则该出版物被视为部门间出版物。我的记录集包含基于PublicationID的部门/programid,因此-选择programid,其中PublicationID=12345-现在我需要查看programid是否相同或不同。在不使用循环或游标的情况下,这可能是更好的方法。您是否可以进一步阐述您的问题?我们不希望在sql中计算值时使用循环。我们使用聚合。比如countYourValue。给我们一些关于数据和期望输出的实际细节,我们可以提供帮助。这是一个很好的起点。我有一份属于不同部门作者的出版物清单。如果所有作者来自同一部门,则该出版物被视为部门内出版物。如果多个部门参与了该出版物的写作,则该出版物被视为部门间出版物。我的记录集包含基于PublicationID的部门/程序ID,因此-选择PublicationID=12345的程序ID-现在我需要查看程序ID是否相同或不同-您和Giorgos都很棒-很难调用正确的answer@user1314159很乐意帮忙!谢谢你的回复,保重!你和Giorgos都很棒-很难说是正确的answer@user1314159很乐意帮忙!谢谢你的回复,保重!