【问题标题】:Insert data into two temporary tables using a stored procedure使用存储过程将数据插入两个临时表
【发布时间】:2016-11-21 22:04:09
【问题描述】:

我有一个存储过程,其数据如下所示

现在我想要的是,我想将它的数据插入两个不同的临时表

第一个临时表将包含这些列

Doc_type, Doc_No, No_of_days

第二个临时表将有列

Username, DocType, No_of_days

我试过这样:

CREATE TABLE #table1 
(
    Doc_type varchar(55),
    Doc_No varchar(55),
    No_of_days varchar(55),
)

INSERT INTO #table1 

但是它会抛出一个错误:

关键字“END”附近的语法不正确。

这是我完整的存储过程:

Alter procedure GET_INWARD_REMINDER_REPORT 
AS 
BEGIN 
    Select
        U.first_name + ' ' + U.last_name UserName, 
        TH.User_ID, 
        TY.Type_desc Document_Type, 
        RA.mkey Reporting_To,
        U.Email AS UserEmail, 
        RAU.Email AS RA1_Email, 
        RAU.first_name + ' ' + RAU.last_name RAName, 
        TH.Doc_No, 
        DATEDIFF(DAY, TH.LastAction_DateTime, GETDATE()) - DATEDIFF(WK, TH.LastAction_DateTime, GETDATE()) AS No_Of_Days_Doc_Pending 
    from  
        inward_doc_tracking_hdr TH 
    inner join  
        user_mst U ON TH.User_Id = U.mkey 
    inner join 
        emp_mst M ON M.mkey = U.employee_mkey 
    inner join 
        type_mst_a TY ON TY.master_mkey = TH.doc_type 
    inner join 
        emp_mst RA ON RA.mkey = M.Reporting_To 
    inner join  
        user_mst RAU ON RAU.employee_mkey = RA.mkey 
    where 
        TH.Status_flag NOT IN (5,14)  --- 5 for close, 14 for return
        and TH.To_user IS NOT NULL 

CREATE TABLE #table1 
(   
    Doc_type varchar(55),
    Doc_No varchar(55),
    No_of_days varchar(55),
)

INSERT INTO #table1 

【问题讨论】:

  • 临时表的范围是直到会话,即一旦执行 sp。临时表将不再存在......
  • @sandeeprawat:我知道,但请帮我了解如何插入临时表
  • 仍然需要插入数据然后将创建表移到顶部。并插入 \
  • @sandeeprawat:是的,它有效,但是如何检查它的temp1 表记录?
  • 这就是为什么我说它是无用的,直到你不再使用结果.. 测试做最后选择

标签: sql sql-server stored-procedures sql-server-2005


【解决方案1】:

获取所有数据到临时表然后插入。

INSERT INTO #MainTemp
EXEC [GET_INWARD_REMINDER_REPORT];

INSERT INTO #table1
select Doc_type, Doc_No, No_of_days from #MainTemp

INSERT INTO #table2
select Username, DocType, No_of_days from #MainTemp

更新

您可以使用MainTempTable

Alter procedure GET_INWARD_REMINDER_REPORT 
AS 
BEGIN 

IF EXISTS(SELECT * FROM   dbo.MainTempTable) 
  DROP TABLE dbo.MainTempTable

Select 
U.first_name + ' ' + U.last_name UserName, 
TH.User_ID, 
TY.Type_desc Document_Type, 
RA.mkey Reporting_To, 
U.Email AS UserEmail, 
RAU.Email AS RA1_Email, 
RAU.first_name + ' ' + RAU.last_name RAName, 
TH.Doc_No, 
DATEDIFF(DAY,TH.LastAction_DateTime,GETDATE()) - DATEDIFF(WK,TH.LastAction_DateTime, GETDATE()) 
AS No_Of_Days_Doc_Pending 

INTO MainTempTable

from inward_doc_tracking_hdr TH 
inner join  
user_mst U ON TH.User_Id = U.mkey 
inner join 
emp_mst M ON M.mkey = U.employee_mkey 
inner join 
type_mst_a TY ON TY.master_mkey = TH.doc_type 
inner join 
emp_mst RA ON RA.mkey = M.Reporting_To 
inner join  
user_mst RAU ON RAU.employee_mkey = RA.mkey 
where 
TH.Status_flag NOT IN (5,14) --- 5 for close, 14 for return 
and TH.To_user IS NOT NULL 

SELECT 
   userName, 
   COUNT(Doc_No) CountofDocNo
FROM 
   MainTempTable 
GROUP BY 
   userName

END 

【讨论】:

  • 我应该在哪里写这个查询,在 SP 内部还是外部??
  • cmets后一头雾水,你想在哪里做?
  • 如果以后要使用,必须插入本地表,临时表不能这样
  • 是的,我稍后将使用它从两个表中向用户发送邮件。
  • 为什么不再执行sp呢?
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多