【发布时间】:2016-11-07 12:58:40
【问题描述】:
我有一个返回结果集的存储过程。之后,我将此结果集插入到创建的真实表中。然后我正在使用该真实表创建 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]
就逻辑而言,我是否走在正确的道路上?
【问题讨论】:
-
似乎非常很危险 - 如果两个用户同时点击它,一个用户将抹去另一个用户的结果。似乎带有会话 ID 列的表或其他方法会更安全。
-
您不需要填充临时表,您可以直接进入真实表。此外,您还需要注意,只有在表没有外键主页时才能截断表
-
用户没有运行此报告。我是每周部署它并通过电子邮件发送它的人。
-
那么我应该在我的存储过程中在哪里说截断表?
-
在插入之前的任何时候。所以流程是这样的:
CREATE SP AS ... TRUNCATE TABLE ... INSERT INTO RealTable SELECT ... FROM ... WHERE ...'.
标签: sql-server tsql ssms