我有一个长期连接,应用程序在其上创建临时表并使用它来获取一些动态运行时数据。根据我的理解,只要在同一个连接上完成,就应该可以引用这个临时表。当我做一堆原始查询时,确实可能,但是使用sprocs是不可能的。我使用ADO.NET。
我错过了一些明显的东西吗?
作品
CREATE TABLE #CustomerNames (CustomerName nvarchar(200) PRIMARY KEY)
DECLARE @CustomerName nvarchar(200)
SET @CustomerName ='Joe Baker'
INSERT INTO #CustomerNames (CustomerName) VALUES (@CustomerNames)
不起作用
EXEC customerNames_createTempTable
EXEC customerNames_addCustomerName 'Joe Baker'
其中sprocs封装了查询
编辑:解决方案是使用查询在sproc之外创建临时表,然后使用sprocs对同一连接上的表执行所有操作。这样临时表不会超出范围。
答案 0 :(得分:4)
自从我使用SQL Server以来已经有一段时间了,但据我所知,在存储过程中创建的临时表仅在过程执行期间存在。换句话说,它们在程序结束时被删除。
答案 1 :(得分:2)
问题是临时表的有效范围。临时表仅存在于创建表的存储过程内,并且存在于第一个sproc正在调用的所有存储过程中。因此,在您的不工作示例中,调用customerNames_createTempTable
后临时表无效。
解决方案是全局临时表。这些临时表是用'#'创建的,例如## CustomerNames。但请注意:全局临时表对所有SQL Server连接都可见。所以你必须用一个唯一的名字来命名它们。
BTW:当你不再需要临时表时,明确删除它们是个好习惯。