簡體   English   中英

將存儲過程數據插入到臨時表中不起作用

[英]Insert stored procedure data into temp table not working

我創建了一個包含3個參數的存儲過程。 見下文

ALTER PROCEDURE [dbo].[Leave_Allocation_Mar_2016]
    @Type nvarchar(10),
    @Month int,
    @Year int
AS
BEGIN
    declare @emp_card_no numeric(9)
    declare @emp_name varchar(20)
    declare @dt_of_join datetime
    declare @Total_days numeric(5,2)
    declare @Days_worked numeric(5,2)
    declare @Final_PaidDayLop numeric(5,2)
    declare @TotalRecord int
    declare @actualMonth int
    declare @actualYear int
    declare @actuallastdate varchar(20)     
 IF(@Type = 'C')
BEGIN
            Print 'Yes I am in the Current process';                        
        DECLARE daily_Allocate CURSOR FOR  
                Select distinct c.emp_card_no, c.emp_name, c.Dt_Of_Join from emp_mst c  
                    join emp_mon_day d 
                    on c.emp_card_no=d.emp_mkey 
                    WHERE Dt_Of_Join =  CAST(FLOOR(CAST( DATEADD(month, -6, GETDATE()) AS FLOAT ))AS DATETIME)                  
            OPEN daily_Allocate   
            FETCH NEXT FROM daily_Allocate INTO
            @emp_card_no, @emp_name, @Dt_Of_Join                
            WHILE @@FETCH_STATUS = 0   
            BEGIN                                           
                    select  @Total_days = Sum(total_day),@Days_worked = Sum(days_worked)
                    from emp_mon_day a      
                    where  a.emp_mkey = 2519
                    group by emp_mkey                               
                        PRINT 'Employee Card no = ' + cast(@emp_card_no as char)
                        PRINT 'Total days = ' + cast(@Total_days as char)
                        PRINT 'Days Worked = ' +    cast(@Days_worked as char)                  
                set @Final_PaidDayLop = 0;
                set @TotalRecord = 0;       

                 Select @Final_PaidDayLop =  
                    isnull(sum(days),0)
                    from  P_Emp_Del_App_Hdr c join P_Emp_Del_App_trl d on c.mkey=d.mkey       
                    where c.delete_flag='N' and app_flag='Y' and c.year = @actualYear
                   and c.emp_mkey = @emp_card_no              

            Select @TotalRecord =  ((1.75 * 6) / @Total_days) * (@Days_worked + @Final_PaidDayLop) 
                from emp_mon_day a where  a.emp_mkey = @emp_card_no group by a.emp_mkey                         

        PRINT 'Final Paid LOP '  + cast(coalesce(@Final_PaidDayLop,0) as char)  
        PRINT 'Total Record ' + cast(coalesce(@TotalRecord,0) as char)                  

                  FETCH NEXT FROM daily_Allocate INTO 
                  @emp_card_no, @emp_name, @Dt_Of_Join 
            END   
        CLOSE daily_Allocate   
        DEALLOCATE daily_Allocate
END     END

這給我輸出如下

圖像描述

現在我想要的是,我想將以上數據插入到臨時表中。

我嘗試如下

CREATE TABLE #tmp1111
(
  Sr_no int identity(1,1),
   Current_Status nvarchar(255),
   Emp_card_no int,
   Total_days int,
   days_worked int,
   final_lop_paid int,
   total_record int
)

首先,我創建了一個臨時表,並嘗試如下插入數據

INSERT INTO #tmp1111 exec Leave_Allocation_Mar_2016 'C', '2', '2016'

它執行成功,但是當我運行select語句時,臨時表中沒有記錄。

我正在使用SQL Server 2005

代替@Result表使用以下變量:

CREATE TABLE #Results
(
   Emp_card_no      NUMERIC(9),
   Total_days       NUMERIC(5,2),
   Days_worked      NUMERIC(5,2),
   Final_PaidDayLop NUMERIC(5,2),
   TotalRecord      INT
)

INSERT INTO #Results
( 
    Emp_card_no,
    Total_days,
    Days_worked,
    Final_PaidDayLop
)
VALUES  
( 
    @emp_card_no ,      -- Emp_card_no - numeric
    @Total_days ,       -- Total_days - numeric
    @Days_worked ,      -- Days_worked - numeric
    @Final_PaidDayLop   -- Final_PaidDayLop - numeric
)

並在DEALLOCATE daily_Allocate之后插入以下語句

SELECT * FROM #Results
DROP TABLE #Results

該select語句返回在執行游標時將記錄插入#Results臨時表中的所有行

進行更改,希望這一點對您有所幫助

更新:

ALTER PROCEDURE [dbo].[Leave_Allocation_Mar_2016]
    @Type   NVARCHAR(10),
    @Month  INT,
    @Year   INT
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #Results
    (
       Emp_card_no      NUMERIC(9),
       Total_days       NUMERIC(5,2),
       Days_worked      NUMERIC(5,2),
       Final_PaidDayLop NUMERIC(5,2),
       TotalRecord      INT
    )

    DECLARE @emp_card_no        NUMERIC(9)
    DECLARE @emp_name           VARCHAR(20)
    DECLARE @dt_of_join         DATETIME
    DECLARE @Total_days         NUMERIC(5,2)
    DECLARE @Days_worked        NUMERIC(5,2)
    DECLARE @Final_PaidDayLop   NUMERIC(5,2)
    DECLARE @TotalRecord        INT
    DECLARE @actualMonth        INT
    DECLARE @actualYear         INT
    DECLARE @actuallastdate     VARCHAR(20)     

    IF(@Type = 'C')
    BEGIN

        PRINT 'Yes I am in the Current process';                        

        DECLARE daily_Allocate CURSOR 
        LOCAL SCROLL STATIC
        FOR        
        SELECT DISTINCT c.emp_card_no, c.emp_name, c.Dt_Of_Join FROM emp_mst c  
        JOIN emp_mon_day d ON c.emp_card_no=d.emp_mkey 
        WHERE Dt_Of_Join = 
        CAST(FLOOR(CAST( DATEADD(month, -6, GETDATE()) AS FLOAT)) AS DATETIME)                  

        OPEN daily_Allocate   
        FETCH NEXT FROM daily_Allocate INTO @emp_card_no, @emp_name, @Dt_Of_Join                

        WHILE @@FETCH_STATUS = 0   
        BEGIN                                           
            SELECT @Total_days = SUM(total_day), @Days_worked = SUM(days_worked)
            FROM emp_mon_day a      
            WHERE a.emp_mkey = 2519
            GROUP BY emp_mkey                               

            PRINT 'Employee Card no = ' + cast(@emp_card_no AS CHAR)
            PRINT 'Total days = ' + cast(@Total_days AS CHAR)
            PRINT 'Days Worked = ' + cast(@Days_worked AS CHAR)                  

            SET @Final_PaidDayLop = 0;
            SET @TotalRecord = 0;       

            SELECT @Final_PaidDayLop = ISNULL(SUM(days), 0)
            FROM  P_Emp_Del_App_Hdr c JOIN P_Emp_Del_App_trl d ON c.mkey=d.mkey       
            WHERE c.delete_flag='N' AND app_flag='Y' AND c.year = @actualYear 
            AND c.emp_mkey = @emp_card_no              

            SELECT 
            @TotalRecord = ((1.75 * 6) / @Total_days) * (@Days_worked + @Final_PaidDayLop) 
            FROM emp_mon_day a 
            WHERE  a.emp_mkey = @emp_card_no 
            GROUP BY a.emp_mkey                         

            PRINT 'Final Paid LOP '  + CAST(COALESCE(@Final_PaidDayLop, 0) AS CHAR)  
            PRINT 'Total Record ' + CAST(COALESCE(@TotalRecord, 0) AS CHAR)                  

            INSERT INTO #Results
            ( 
                Emp_card_no,
                Total_days,
                Days_worked,
                Final_PaidDayLop
            )
            VALUES  
            ( 
                @emp_card_no ,      -- Emp_card_no - numeric
                @Total_days ,       -- Total_days - numeric
                @Days_worked ,      -- Days_worked - numeric
                @Final_PaidDayLop   -- Final_PaidDayLop - numeric
            )

        FETCH NEXT FROM daily_Allocate INTO @emp_card_no, @emp_name, @Dt_Of_Join 
        END   

        CLOSE daily_Allocate   
        DEALLOCATE daily_Allocate

        SELECT * FROM #Results
        DROP TABLE #Results

    END     
END

然后EXEC Leave_Allocation_Mar_2016 'C', '2', '2016'您將在表輸出中獲得結果

而不是打印值,而是將其存儲在局部變量中(或插入表變量中)並從存儲過程中將其返回,然后它將起作用

例如:-

BEGIN
....
DECLARE @v_str AS NVARCHAR(500)
SET @v_str = ''
...
SELECT @v_str = @v_str+'Yes I am in the Current process'
...
SELECT @v_str = @v_str+'Total Records'
.
.
SELECT @v_str AS result
END

您的存儲過程沒有直接輸出,僅打印變量。 您需要返回所需的值,例如在表中:

請注意,該表是必需的,而不僅僅是返回變量,因為游標中可能有多個循環

ALTER PROCEDURE [dbo].[Leave_Allocation_Mar_2016]
    @Type nvarchar(10),
    @Month int,
    @Year int
AS
BEGIN
    DECLARE @Results TABLE (
       Emp_card_no NUMERIC(9),
       Total_days NUMERIC(5,2),
       Days_worked NUMERIC(5,2),
       Final_PaidDayLop numeric(5,2)
       TotalRecord int
    )

    declare @emp_card_no numeric(9)
    declare @emp_name varchar(20)
    declare @dt_of_join datetime
    declare @Total_days numeric(5,2)
    declare @Days_worked numeric(5,2)
    declare @Final_PaidDayLop numeric(5,2)
    declare @TotalRecord int
    declare @actualMonth int
    declare @actualYear int
    declare @actuallastdate varchar(20)     
 IF(@Type = 'C')
BEGIN
            Print 'Yes I am in the Current process';                        
        DECLARE daily_Allocate CURSOR FOR  
                Select distinct c.emp_card_no, c.emp_name, c.Dt_Of_Join from emp_mst c  
                    join emp_mon_day d 
                    on c.emp_card_no=d.emp_mkey 
                    WHERE Dt_Of_Join =  CAST(FLOOR(CAST( DATEADD(month, -6, GETDATE()) AS FLOAT ))AS DATETIME)                  
            OPEN daily_Allocate   
            FETCH NEXT FROM daily_Allocate INTO
            @emp_card_no, @emp_name, @Dt_Of_Join                
            WHILE @@FETCH_STATUS = 0   
            BEGIN                                           
                    select  @Total_days = Sum(total_day),@Days_worked = Sum(days_worked)
                    from emp_mon_day a      
                    where  a.emp_mkey = 2519
                    group by emp_mkey                               
                        PRINT 'Employee Card no = ' + cast(@emp_card_no as char)
                        PRINT 'Total days = ' + cast(@Total_days as char)
                        PRINT 'Days Worked = ' +    cast(@Days_worked as char)                  
                set @Final_PaidDayLop = 0;
                set @TotalRecord = 0;       

                 Select @Final_PaidDayLop =  
                    isnull(sum(days),0)
                    from  P_Emp_Del_App_Hdr c join P_Emp_Del_App_trl d on c.mkey=d.mkey       
                    where c.delete_flag='N' and app_flag='Y' and c.year = @actualYear
                   and c.emp_mkey = @emp_card_no              

            Select @TotalRecord =  ((1.75 * 6) / @Total_days) * (@Days_worked + @Final_PaidDayLop) 
                from emp_mon_day a where  a.emp_mkey = @emp_card_no group by a.emp_mkey                         

        PRINT 'Final Paid LOP '  + cast(coalesce(@Final_PaidDayLop,0) as char)  
        PRINT 'Total Record ' + cast(coalesce(@TotalRecord,0) as char)                  

                    INSERT INTO @Results
                            ( Emp_card_no ,
                              Total_days ,
                              Days_worked ,
                              Final_PaidDayLop
                            )
                    VALUES  ( @emp_card_no , -- Emp_card_no - numeric
                              @Total_days , -- Total_days - numeric
                              @Days_worked , -- Days_worked - numeric
                              @Final_PaidDayLop  -- Final_PaidDayLop - numeric
                            )
                  FETCH NEXT FROM daily_Allocate INTO 
                  @emp_card_no, @emp_name, @Dt_Of_Join 
            END   
        CLOSE daily_Allocate   
        DEALLOCATE daily_Allocate

    SELECT 'Yes I am in the Current process', *
    FROM @Results

END     
END

我還建議您整理變量命名的格式和一致性,以使其更易於手動解析。 確保您的光標始終處於關閉狀態的一些錯誤處理將很有用。

還建議將光標聲明為FAST_FORWARD,READ_ONLY:

使用FAST_FORWARD定義游標的好處是什么?

試試這個代替光標:

    declare @dt_of_join date

    set @dt_of_join = DATEADD(month, -6, GETDATE())

    Select 
      c.emp_card_no, c.emp_name,
      (1.75 * 6) / NullIf(d.Total_days, 0)) * (IsNull(d.Days_worked, 0) + IsNull(p.Final_PaidDayLop, 0)) as TotalRecord
    from dbo.emp_mst c  
    outer apply
    (
      select 
        sum(d.total_day) as total_days
        sum(d.days_worker) as days_worker
      from dbo.emp_mon_day d
      WHERE d.emp_mkey = c.emp_card_no
      GROUP BY d.emp_mkey
    ) d
    outer apply
    (
      select sum(cc.days) as Final_PaidDayLop
      from  P_Emp_Del_App_Hdr cc
      inner join P_Emp_Del_App_trl dd on cc.mkey=d.mkey
      where cc.delete_flag='N' and dd.app_flag='Y' 
        and cc.year = c.Dt_Of_Join
        and cc.emp_mkey = c.emp_card_no
    ) p
    where c.Dt_Of_Join = @dt_of_join

不確定是否猜對了一切(包括別名)。

並根據需要使用insert exec或其他任何方式插入臨時表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM