我编写了一个存储过程来将数据从一个数据库导入和转换到另一个数据库。每次导入都会采用一个公司 ID 并导入与该公司相关的所有数据。
为了帮助完成转换步骤,我使用临时表。作为脚本审查的一部分,我被告知要使用表变量而不是临时表。
审阅者声称,如果我们同时运行两个不同的导入,临时表将被共享并损坏导入。
问题:
- 如果我们同时运行两个不同的导入,临时表是否会共享?
- 是否每次调用
EXEC
创建一个新范围?
这是一个人为的脚本示例。
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
From CREATE TABLE:
本地临时表仅在当前会话中可见
并且(更重要的是):
如果在可由多个用户同时执行的存储过程或应用程序中创建本地临时表,则数据库引擎必须能够区分不同用户创建的表[原文如此 - 几乎可以肯定这应该说会话而不是用户]。数据库引擎通过在内部将数字后缀附加到每个本地临时表名称来实现此目的。
这恰恰反驳了那些说他们会被分享的人的观点。
另外,也没有必要DROP TABLE
在程序结束时(再次来自同一链接):
当存储过程完成时,在存储过程中创建的本地临时表将自动删除
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)