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