创建临时表并使用存储过程将数据加载到其中

Posted

技术标签:

【中文标题】创建临时表并使用存储过程将数据加载到其中【英文标题】:Create temp table and load data into it using Stored Procedure 【发布时间】:2015-10-20 14:43:27 【问题描述】:

我有三个不同的 SQL 脚本,我能够执行它们并获得所需的结果。我想将它们全部放入一个临时表中,并将其用作存储过程,并获取显示在临时表上的数据。下面是我创建的过程。

我想知道如何创建一个临时表并通过执行 SP 将这些数据插入其中。

CREATE PROCEDURE [dbo].[sp_SurveyTracking]
AS
BEGIN
    SET NOCOUNT ON;
    -- AVAILABLE
    SELECT DISTINCT P.Clinic
        , P.LastName
        , P.FirstName
        , SA.SI AS SID
        , ser.SD
        -- , 'Available' as Status
        , ss.SDate 
        , ss.SDtTm
    FROM 
        Table_Name SA
        Inner join Schedule ss on sa.SIID = ss.SIID
        Inner join Patient p on p.PID = ss.PID
        Inner join Clinical.SSJun ssj on ssj.SSJID = ss.SSJID
        Inner join Clinical.SS ser on ser.SSID = ssj.SSID
    WHERE 
        SS.SDtTm IS NOT NULL
        AND (SS.SDtTm < SS.SDate)
        AND (SS.SDate > GETDATE())
        AND SS.Canc = 0
        AND sa.AD = 'Completed'
        AND GETDATE() > ss.SDate
    Order by p.CID;

    --COMPLETED
        SELECT DISTINCT p.Clinic
            , p.LastName
            , p.FirstName
            , ser.SD
            --, 'Completed' as Status
            , ss.SDate
        FROM 
            Table_Name SA
        Inner join Schedule ss on sa.SIID = ss.SIID
        Inner join Patient p on p.PID = ss.PID
        Inner join Clinical.SSJun ssj on ssj.SSJID = ss.SSJID
        Inner join Clinical.SS ser on ser.SSID = ssj.SSID
        WHERE
            sa.AD = 'Completed'  and ss.Cancelled = 0 
        order by p.CID;
    -- OVERDUE
        SELECT  DISTINCT p.CD
              ,p.LastName
              ,p.FirstName
              ,sa.SIID
              ,ser.SD
              ,'Overdue' as Status
              ,ss.SDate
              ,GetDate() as CurrentDate
        FROM 
            Table_Name SA
        Inner join Schedule ss on sa.SIID = ss.SIID
        Inner join Patient p on p.PID = ss.PID
        Inner join Clinical.SSJun ssj on ssj.SSJID = ss.SSJID
        Inner join Clinical.SS ser on ser.SSID = ssj.SSID
        WHERE
            GetDate() > ss.SDate  and ss.Cancelled = 0 
            order by p.CID;
END

【问题讨论】:

您不应在程序中使用 sp_ 前缀。它有一个特殊的用途,应该只被系统程序使用 你想要这个在一个临时表中吗?您将不得不修改您的查询,因为它们并不都有列数。此外,应该避免使用 SP_(或者甚至更好地完全删除前缀)。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix 【参考方案1】:

您可以在开头定义#table,然后使用

INSERT INTO

将值添加到其中。

类似:

CREATE TABLE #tmp
( 
SomeFields VARCHAR(MAX)
);

INSERT INTO #tmp 
SELECT * FROM table2

如果您喜欢这个答案,请勾选勾选按钮。 谢谢。

【讨论】:

【参考方案2】:

要将 Storec 过程中的数据插入到表/临时表中,首先需要创建表定义

下面是你可以做的示例。

create proc dbo.test
as
select 1 as b

create table #tmp(b int)

insert into #tmp exec dbo.test

【讨论】:

以上是关于创建临时表并使用存储过程将数据加载到其中的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 存储过程创建临时表并插入值

oracle存储过程中临时表的使用,该怎么处理

在存储过程中创建临时表

使用游标处理存储过程中表中的每一行

慢速存储过程 - SQL Server

具有动态结果的存储过程到临时表中