如何创建一个临时存在且可从许多存储过程访问的 table?

How to create a table that exist temporarily and that is accessible from many stored procedures?

我从 .NET 应用程序(时间重新编码)中查询我的数据库。我将 Windows 用户名发送到数据库并根据此信息进行查询。

我使用存储过程查询许多不同的信息,例如假期、加班等,然后将它们发送回 .NET 应用程序,我在其中以一种形式显示这些数据。

假设我需要 Form1 上 SP1、3 和 4 的信息:

FORM1:

SP1
SP3
SP4

我的问题:

我有一个非常复杂的 table 需要这些存储过程。目前,我在每个存储过程中都将此 table 创建为临时 table,这显然非常耗时。

到目前为止我已经尝试过创建一个存储过程来创建一个临时文件 table 但是这个在我的其他存储过程中是不可访问的。

我的问题:我正在寻找一种方法来为 Form1 创建一次 table,这样我就可以在其他存储过程中访问这些 table。

我正在使用 SQL Server 2014 Express。

您必须创建 全局临时文件 table

CREATE TABLE ##TEMP1 
(
    Name varchar(50)   
)

如果您在任何存储过程之外创建临时 table,则可以在每个存储过程中访问它。假设实际的 table 定义不是太复杂(但填充它可能会),这可能是可行的。

所以你会(有效地)执行:

CREATE TABLE #T (A int not null, B varchar(17) not null)
EXEC PopulateTempTable
EXEC SP1
EXEC SP3
EXEC SP4

全部在一个连接上。 PopulateTempTable 可能需要也可能不需要,具体取决于 table 的总体复杂程度以及您是否希望由调用代码或数据库执行。

您不能在存储过程中创建临时 table,因为当退出存储过程的范围时,临时 table 会自动删除。

或者,您可能想要模拟 "session-global" temp tables,正如我建议的 in this answer1.

使用 的风险在于它确实是全球性的 - 所有会话都在同一个 table 中查看数据并与之交互。如果两个会话有可能同时尝试使用它,那么在这种情况下您必须非常小心;您通常需要一些方法来过滤 table 中的数据,以便每个会话只处理自己的数据。


1这些天可能通过添加 Logon Trigger 来增强,以便在建立新连接时清除 table 的旧内容。