【问题标题】:How to create a table that exist temporarily and that is accessible from many stored procedures?如何创建一个临时存在并且可以从许多存储过程中访问的表?
【发布时间】:2017-01-24 12:39:59
【问题描述】:

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

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

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

FORM1

SP1
SP3
SP4

我的问题:

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

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

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

我使用的是 SQL Server 2014 Express。

【问题讨论】:

  • 使用永久表或全局临时表。

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


【解决方案1】:

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

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

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

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

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

或者,您可能想要模拟“会话全局”临时表,我建议 in this answer1

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


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

【讨论】:

    【解决方案2】:

    您必须创建全局临时表

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

    【讨论】:

    • 您至少可以提到,如果同时有多个用户,这是有风险的,并且可能会建议一些降低风险的策略(例如在这张表)
    • 好建议,你的回答更清楚
    • 感谢 Damien 的评论,因为同时有多个用户对我来说是一个相关场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多