截断存储过程中的现有表,然后插入新数据

时间:2016-07-05 15:47:57

标签: sql-server tsql ssms

我有一个返回结果集的存储过程。之后,我将此结果集插入到创建的真实表中。然后我使用真正的表创建SSRS报告。

所以,像这样:

CREATE PROCEDURE Test
AS
   DECLARE @TempTable TABLE(..)

   INSERT INTO @TempTable
       SELECT...
       FROM ...
       WHERE ...

SELECT * FROM @TempTable

--============================

INSERT INTO RealTable EXEC [dbo].[Test] 

如何修改此存储过程,以便每次执行时都会使用现有数据截断表,然后插入一个新数据?

所以我需要这样的东西:

create procedure Test
as
TRUNCATE RealTable
DECLARE @TempTable TABLE(..)

INSERT INTO @TempTable
    SELECT...
    FROM...
    WHERE...

SELECT * FROM @TempTable INTO RealTable

或者我应该只创建运行命令的代理作业:

Truncate Table RealTable
INSERT INTO RealTable EXEC [dbo].[Test] 

我的逻辑方面是正确的吗?

3 个答案:

答案 0 :(得分:0)

  1. 如果要插入相同的数据,截断的目的是什么?
  2. 如果您有超过1个并发用户会怎么样?
  3. 你可以做的另一件事: 1。 插入TargetTable 从SourceTable中选择* 2。 在Tar​​getTable上重建索引 3。 exec sp_rename SourceTable,SourceTable_Old exec sp_rename TargetTable,SourceTable drop table SourceTable_Old

    • 当表变量不是一个选项时,这是整个表数据刷新的旧方法,没有太大影响。

答案 1 :(得分:0)

不要TRUNCATE。使用MERGE语句。

CREATE PROCEDURE Test
AS

MERGE RealTable TRGT
USING SourceTable SRCE
    ON SRCE.[Column] = TRGT.Column --use columns that can be joined together
WHEN MATCHED THEN UPDATE
        SET TRGT.Column1 = SRCE.Column1,
            TRGT.Column2 = SRCE.Column2
        ....................
WHEN NOT MATCHED BY TARGET THEN INSERT
        VALUES
        (
            SRCE.Column1,
            SRCE.Column2,
            .....................
        )
WHEN NOT MATCHED BY SOURCE THEN 
        DELETE;

答案 2 :(得分:0)

这是你可能需要的,因为你直接从@TempTable插入到RealTable。

create procedure Test
as
BEGIN

TRUNCATE TABLE RealTable

INSERT INTO RealTable 
    SELECT...
    FROM someothertable
    WHERE...

END