
SQL Server 中临时表的范围
使用 SQL Server 时,了解临时表的范围对于防止数据损坏至关重要。本文探讨了多用户环境中有关临时表共享的误解,并阐明了 EXEC 在创建新作用域中的作用。
临时表作用域
与声明相反由于临时表是共享的,SQL Server 确保并发导入操作的隔离。正如微软文档中所述:
- 本地临时表仅在当前会话中可见。
- 数据库引擎会在并发会话中创建的临时表名称后附加一个数字后缀,以区分它们.
范围EXEC
每次调用 EXEC 都会创建一个新作用域。这意味着在存储过程中创建的临时表对于同时执行的其他存储过程不可见。
考虑提供的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | CREATE PROC [dbo].[ImportCompany]
(
@CompanyId AS INTEGER
)
AS
EXEC [dbo].[ImportAddress] @CompanyId = @CompanyId
--Import other data
CREATE PROC [dbo].[ImportAddress]
(
@CompanyId AS INTEGER
)
AS
CREATE TABLE #Companies (OldAddress NVARCHAR(128), NewAddress NVARCHAR(128))
INSERT INTO #Companies(OldAddress, NewAddress)
SELECT
Address as OldAddress,
'Transformed ' + Address as NewAddress
FROM
[OldDb].[dbo].[Addresses]
WHERE
CompanyId = @CompanyId
--Do stuff with the transformed data
DROP TABLE #Companies
EXEC [dbo].[ImportCompany] @CompanyId = 12345
|
登录后复制
在这种情况下,#Companies 表是在 ImportAddress 过程结束时自动删除,确保没有并发导入操作可以访问或损坏
结论
SQL Server 中的临时表的范围仅限于当前会话,并且不能在并发导入之间共享。每次调用 EXEC 都会创建一个新作用域,确保隔离并防止数据损坏。因此,在这种情况下,不需要使用表变量来维护数据完整性。
以上是SQL Server如何保证并发进程中临时表的隔离?的详细内容。更多信息请关注PHP中文网其他相关文章!