SQL Server中的本地和全局临时表有什么区别?
我##TheTable使用C#代码创建一个全局临时表(即).我希望能够在代码完全运行后在SQL Server管理工作室中看到临时表.
是否有可能做到这一点 ?如果是,那怎么样?
在MS SQL Server中,我使用全局临时表来存储客户端传递的会话相关信息,然后在触发器中使用该信息.
由于同一个全局临时表可以在不同的会话中使用,当我想写入它时可能存在也可能不存在(取决于之前使用它的所有先前会话是否都已关闭),我正在检查基于我在写入之前创建的全局临时表存在.
IF OBJECT_ID('tempdb..##VTT_CONTEXT_INFO_USER_TASK') IS NULL
CREATE TABLE ##VTT_CONTEXT_INFO_USER_TASK (
session_id smallint,
login_time datetime,
HstryUserName VDT_USERNAME,
HstryTaskName VDT_TASKNAME,
)
MERGE ##VTT_CONTEXT_INFO_USER_TASK As target
USING (SELECT @@SPID, @HstryUserName, @HstryTaskName) as source (session_id, HstryUserName, HstryTaskName)
ON (target.session_id = source.session_id)
WHEN MATCHED THEN
UPDATE SET HstryUserName = source.HstryUserName, HstryTaskName = source.HstryTaskName
WHEN NOT MATCHED THEN
INSERT VALUES (@@SPID, @LoginTime, source.HstryUserName, source.HstryTaskName);
Run Code Online (Sandbox Code Playgroud)
问题是,在检查表存在和MERGE语句之间,如果之前使用它的所有会话碰巧在该确切的实例中关闭,SQL Server可能会删除临时表(这实际上发生在我的测试中).
是否有关于如何避免这种并发问题的最佳实践,在检查它的存在与其后续使用之间不会删除表?
sql-server concurrency session race-condition global-temp-tables
我想知道,这两个脚本有什么区别?
SELECT * FROM ##TEMP
Run Code Online (Sandbox Code Playgroud)
还有这个
SELECT * FROM #TEMP
Run Code Online (Sandbox Code Playgroud) 一般来说,我构建使用 sp_executsql 执行的动态 SQL 语句,如下所示:
EXEC sp_executesql @TempSQLStatement
Run Code Online (Sandbox Code Playgroud)
我需要将返回结果行集插入某些内容(表变量或临时表),但出现以下错误:
Msg 208, Level 16, State 0, Line 1746
Invalid object name '#TempTable'.
Run Code Online (Sandbox Code Playgroud)
执行此操作后:
INSERT INTO #TempTable
EXEC sp_executesql @TempSQLStatement
Run Code Online (Sandbox Code Playgroud)
根据我所读到的内容,我认为问题是由于我没有指定临时表的列而引起的,但我无法执行此操作,因为返回列数有所不同。
我读过我可以使用全局临时表,但我之前已经这样做过,想知道是否还有其他方法可以做到这一点。
我们知道,在 SQL Server 中,创建一个表的#意思是“本地临时表”,##意思是“全局临时表”。
但是当我创建一个如下表时:
create table ###MyTable(IntColumn int, ValueColumn varchar(100))
Run Code Online (Sandbox Code Playgroud)
该表是本地临时表还是全局临时表?我该如何测试?当我尝试select通过:
Select * from #MyTable -- SQL said it doesn't exists
Select * from ##MyTable -- SQL said it doesn't exists
Select * from ###MyTable -- I get the output
Run Code Online (Sandbox Code Playgroud)
如果第三种情况属实,这是否意味着这是名称为 的通用表###MyTable?我不会像其他所有物理表一样在我的 SSMS 表浏览器中看到这张表吗?
如果我开始在表名前添加多个 #(哈希)会发生什么?
帮助我了解Global临时表的工作原理
我的进程将是线程化的,并且只需要对该线程会话可见的数据.所以我们选择了Global Temporary Table.
在完成所有线程后放弃全局临时表是否更好,或者删除表是否明智.调用此过程可能会在一天内发生一次或两次.
大约需要4张桌子
sql-server ×5
temp-tables ×5
t-sql ×2
.net ×1
c# ×1
concurrency ×1
oracle ×1
session ×1
sql ×1