1,获取存储过程最后select返回的结果集。SELECT 数据集返回值。
因为select返回的结果是一个表。所以返回的结果需要用一个表接收。使用临时表接收。
被调用的存储过程最后是这样:返回了一个空标题的字段。
什么都不处理,调用存储过程,发现是这样:
ALTER PROCEDURE [LC0**999].[ERP_***_CreateBatchCode] ( @MaterialID varchar(50), @CompanyID varchar(50), @Flag varchar(50), @PrefixObj varchar(50) ) AS BEGIN declare @v_batchcode varchar(36); exec @v_batchcode=erp_IM_BatchesSN_CreateCode @MaterialID,@CompanyID,@Flag,@PrefixObj; select @v_batchcode BATCHCODE; END
执行结果:
会发现返回了三个数据集,不仅原来的存储过程会返回一个数据集(这里的情况是不需要那个存储过程返回,而是赋值给变量,由变量返回),这里调用原来的存储过程也并没有真正赋值给变量。所有返回的变量的值仍然为空。
我们真正的需求是只返回一个被赋值了的BATCHCODE。
修改:用临时表接收返回结果集,把临时表的相关字段赋值给变量。如下:
ALTER PROCEDURE [LC00****].[ERP_****_CreateBatchCode] ( @MaterialID varchar(50), @CompanyID varchar(50), @Flag varchar(50), @PrefixObj varchar(50) ) AS BEGIN declare @v_batchcode varchar(36); CREATE TABLE [LC0019999].[batchtemp]( batchcode varchar(36) ) INSERT batchtemp exec @v_batchcode=erp_IM_BatchesSN_CreateCode @MaterialID,@CompanyID,@Flag,@PrefixObj; SELECT @v_batchcode=batchtemp.batchcode FROM batchtemp; DROP TABLE batchtemp; select @v_batchcode BATCHCODE; END
执行结果:
可见,被调用的存储过程没有返回一个select结果集,并且,值被成功的赋值给变量。只返回了一个数据集。
2,OUPUT参数返回值
CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEGIN SET NOCOUNT ON; BEGIN INSERT INTO [Order](o_buyerid ) VALUES (@o_buyerid ) SET @o_id = @@IDENTITY END END
存储过程中获得方法:
DECLARE @o_buyerid int DECLARE @o_id bigint EXEC [nb_order_insert] @o_buyerid,@o_id output
3,RETURN过程返回值
CREATE PROCEDURE [dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEGIN SET NOCOUNT ON; IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_buyerid )) BEGIN INSERT INTO [Order](o_buyerid ) VALUES (@o_buyerid ) SET @o_id = @@IDENTITY RETURN 1 — 插入成功返回1 END ELSE RETURN 0 — 插入失败返回0 END
存储过程中的获取方法
DECLARE @o_buyerid int DECLARE @o_id bigint DECLARE @result bit EXEC @result = [nb_order_insert] @o_buyerid ,o_id output