我在.NET应用程序中查询我的数据库(时间重新编码)。我将Windows用户名发送到数据库并根据此信息进行查询。
我使用存储过程查询了很多不同的信息,例如假日,加班等,然后将它们发送回.NET应用程序,我以一种形式显示这些数据。
我们需要Form1
上的SP1,3和4中的信息:
FORM1 :
SP1
SP3
SP4
我的问题:
我有一个非常复杂的表,我需要这些存储过程。目前,我在每个存储过程中创建此表作为临时表,这显然非常耗时。
我到目前为止所尝试的是创建一个存储过程来创建一个临时表,但是这个存储过程在我的其他存储过程中是不可访问的。
我的问题:我正在寻找一种方法为Form1
创建一次这个表,所以我可以在其他存储过程中访问这些表。
我使用的是SQL Server 2014 Express。
答案 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)
)