got*_*tqn 3 sql-server temporary-tables
我修改了构建动态 SQL 语句来创建和填充临时表的过程。语法是这样的:
...'create #temp_' + CAST(GETGUID() AS VARCHAR(36)) ...
Run Code Online (Sandbox Code Playgroud)
我问一位同事是否知道为什么将唯一标识符连接到表名。他告诉我,以前有过跨会话共享临时表的情况,导致数据混乱。
我知道这是不可能的,因为 MSDN 明确指出:
您可以创建本地和全局临时表。本地临时表仅在当前会话中可见,全局临时表对所有会话可见。
现在(记住这个例子)一些同事认为我们应该使用上面的语法作为一个好的实践,但我不喜欢它,需要证明不存在这样的错误,或者如果有的话它已经被修复了。
有 SQL Server 2005/2008 经验的人可以告诉我是否有过这种情况吗?
本地表决不应该在会话之间共享。正如您所指出的,它们仅对创建它们的会话可见,并在创建会话终止或您删除它们时被销毁。
全局临时变量对所有会话都可见,但您需要使用双散列 ie 定义它们##temp
,以便将它们定义为全局变量。
至于在创建表名时为其添加后缀,你就是在浪费时间,因为 SQL Server 无论如何都会这样做。
CREATE TABLE #temp (Name VARCHAR(20));
USE tempdb;
GO
SELECT name FROM sys.tables WHERE name LIKE '#temp%';
Run Code Online (Sandbox Code Playgroud)
对我来说,这返回
#temp_______________________________________________________________________________________________________________00000000004C
Run Code Online (Sandbox Code Playgroud)
然而,正如 Aaron Bertrand 在这个答案中指出的那样:
如果您将所有内容都称为#temp、#t 或#x,那么在调用该过程之前,外部作用域中可能已经存在这样的表。
在这种情况下,您可以在顶级进程和它在该进程内调用的许多不同过程之间共享临时表。这当然可能会导致数据损坏,具体取决于您如何定义和构建临时表。
归档时间: |
|
查看次数: |
16281 次 |
最近记录: |