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

时间:2016-09-16 10:08:59

标签: sql-server tsql stored-procedures temp-tables sql-server-2014-express

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

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

我们需要Form1上的SP1,3和4中的信息:

FORM1

SP1
SP3
SP4

我的问题:

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

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

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

我使用的是SQL Server 2014 Express。

2 个答案:

答案 0 :(得分:2)

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

所以你执行(有效):

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

所有单一连接。 PopulateTempTable可能需要也可能不需要,具体取决于表的填充程度是多么复杂,以及您是否希望由调用代码或数据库执行该操作。

您无法在存储过程内部创建临时表,因为在退出存储过程的范围时会自动删除临时表。

或者,您可能希望模拟“会话全局”临时表,因为我建议in this answer 1

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

1 这些天可能还会增加一个Logon Trigger,以便在建立新连接时清除表中的旧内容。

答案 1 :(得分:1)

您必须创建全球临时表

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