代码之家  ›  专栏  ›  技术社区  ›  TallGuy

如何从另一个存储过程中使用存储过程的结果?

  •  10
  • TallGuy  · 技术社区  · 16 年前

    我有一个要从另一个内部调用的存储过程,然后循环遍历结果。有点像将光标与存储过程一起使用,而不是使用SQL Select语句。我不太明白该怎么做。

    我可以得到这样的结果:

    DECLARE @result int;
    EXEC @result = sp_who;
    PRINT @result;
    

    有趣的是,这似乎将@result的类型改为int以外的其他类型,但不管怎样。然后如何逐行循环遍历结果?如何从各个列访问数据?例如,如果第四列(loginname)类似于“%gatesb”或其他内容,我将如何终止进程?

    4 回复  |  直到 7 年前
        1
  •  12
  •   STLDev    7 年前

    您将声明一个表变量来保存存储过程的结果,然后在while循环中循环这些结果:

    declare @temp table (
        idx int identity(1,1),
        field1 int,
        field2 varchar(max))
    
    declare @result int
    
    insert into @temp (field1, field2)
    exec @result = sp_who
    
    declare @counter int
    
    set @counter = 1
    
    while @counter < (select max(idx) from @temp)
    begin
        -- do what you want with the rows here
        set @counter = @counter + 1
    end
    
        2
  •  2
  •   Linda    16 年前

    将sp\u who重写为表函数

        3
  •  2
  •   Scott Ivey    16 年前

    您可以将存储过程的结果插入到具有匹配列的表中…

    create table #spWhoResults
        (spid smallint,
        ecid smallint,
        status nchar(60),
        loginame nchar(256),
        hostname nchar(256),
        blk char(5),
        dbname nvarchar(128),
        cmd nchar(32),
        request_id int)
    
    go
    
    insert  #spWhoResults
    exec    sp_who
    
    
    select  *
    from    #spWhoResults
    
    /* 
    put your cursor here to loop #spWhoResults to 
    perform whatever it is you wanted to do per row
    */
    
        4
  •  0
  •   eKek0    16 年前

    贾斯汀指出的是你必须做的,但不是做

    while @counter < (select max(idx) from @temp)
    

    这样做

    declare @maxid int
    select @maxid = max(idx), @counter = 1
    from @temp
    while @counter < @maxid begin
    -- go on
      set @counter = @counter + 1
    end
    

    另外,如果将表声明为@temp不起作用,您可以将其声明为temp。