SQL - 将存储过程的结果保存到变量中

时间:2015-11-13 09:15:15

标签: sql sql-server tsql stored-procedures

我有一个无法更改的存储过程。它返回一个选择值(整数)。

它插入一些值并返回新的id - 存储过程的最后一行:

<Grid>
    <Grid.ColumnDefinitions>
        <!--change-->
        <ColumnDefinition Width="33*" />
        <!--change-->
        <ColumnDefinition Width="66*" />
    </Grid.ColumnDefinitions>
    <Border x:Name="Border1" BorderBrush="Gainsboro" BorderThickness="5" CornerRadius="8,8,3,3" Margin="10,10,10,10.4" >
        <ListBox x:Name="lbButtons" Background="{x:Null}" BorderBrush="{x:Null}" Margin="10,10,10,10" />
    </Border>
    <Border x:Name="Border2" BorderBrush="Gainsboro" BorderThickness="5" CornerRadius="8,8,3,3" Grid.Column="1" Margin="10,10,9.2,10" />
</Grid>

我正在使用新ID,但在运行存储过程时,我不想显示该值。

所以我使用以下内容:

SELECT @newID

这成功执行,但是当创建的实际值和存储过程的返回值是实际的id号时,我的变量@test总是= 0。

为什么我的变量没有被分配?

我有一个解决方法(这不是我想要的,但它有效:

DECLARE @test INT 
EXEC @test = Pr_My_Procedure 'NewGroupName'
SELECT @test

这样可行,但是在运行存储过程时,我仍然会在结果上返回生成的GroupID(第2行)。我不想看到这个。

是否可以不从程序中返回选择结果?

感谢大家的任何建议!

2 个答案:

答案 0 :(得分:4)

当你这样做时

exec @p = StoredProc

...您正在处理proc的返回值,而不是proc的结果集。过程的默认返回值为零,这样如果在过程中没有显式RETURN,则返回0.

您可以将程序更改为RETURN您的ID,或添加输出参数。

-- Procedure which RETURNS the ID
create procedure StoredProc_WithReturn
as
    return 10;
go

-- Procedure which uses output parameter instead.
create procedure StoredProc_WithOutput 
@p int output
as
    select @p = 12;
go

-- Now test both ways of returning a value
declare @p int = 0,
        @po int = 0;

exec @p = StoredProc_WithReturn;
select @p;

exec StoredProc_WithOutput @po output;
select @po;

由于您无法更改过程,因此可以将过程的结果集插入到表,临时表或表变量中,如此

create procedure StoredProc_WithSelect
as
    select 10;
go

declare @pt table (a int);

insert @pt 
exec StoredProc_WithSelect;
select a from @pt;

答案 1 :(得分:0)

如果您没有看到结果,则可以使用PRINT代替SELECT。试试这个:

DECLARE @test INT 
EXEC @test = Pr_My_Procedure 'NewGroupName'
PRINT @test