Sql-Server-2008-R2

為什麼我不能獲取臨時表的 OBJECT_NAME()?

  • May 7, 2020

根據這篇 MSDN 文章http://msdn.microsoft.com/en-us/library/ms190328.aspx

指定臨時表名時,數據庫名必須在臨時表名之前,除非目前數據庫是 tempdb。例如:SELECT OBJECT_ID('tempdb..#mytemptable')

但是,當我實際上在數據庫中創建臨時表時tempdb,函式未按指定工作:

use beta1
create table #t(id int)
select object_name(object_id('tempdb..#t')) as from_beta1
use tempdb
select object_name(object_id('tempdb..#t')) as from_tempdb
drop table #t

這就是我所看到的:

from_beta1
----------
NULL

from_tempdb
---------------
#t_________________...______0000000000B9

我錯過了什麼或做錯了什麼?

您必須告訴object_name它需要查看 tempdb 的元數據。

select object_name(object_id('tempdb..#t'), db_id('tempdb')) as from_beta1

object_id()正在返回一個值;問題是object_name()(這不是您正在查看的文件)預設情況下會查找sys.objects目前數據庫上下文。

object_name()當您顯然已經知道名稱(#t)時,不知道為什麼需要在這裡使用。還是你想得到#t___________acde4521?你到底要做什麼#t___________acde4521?為什麼?

你可以得到它,但我推薦這種方式:

SELECT name 
 FROM tempdb.sys.objects 
 WHERE [object_id] = OBJECT_ID(N'tempdb.dbo.#t');

這就是我嘗試謹慎使用元數據函式的原因:

不過,仍然對您將要使用該名稱做什麼感到困惑…

引用自:https://dba.stackexchange.com/questions/80195