在SQL Server 2008中,有没有办法根据OBJECT_ID
?
[编辑]下面描述的例子是在评论中使用安德鲁的建议解决的,但我仍然对一般情况感到好奇。可以使用OBJECT_ID
检索对象本身,还是只能通过sp_executesql
使用对象名称间接访问它?
我的具体情况是使用多个临时表的存储过程。在过程结束时,我想将临时表中的数据转储到实际的表中进行分析(仅当启用了调试开关时)。
转储数据的代码与此类似:
IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL
BEGIN
IF OBJECT_ID('Debug_MyTempTable', 'U') IS NOT NULL
DROP TABLE Debug_MyTempTable
SELECT * INTO Debug_MyTempTable FROM #MyTempTable
END
对每个临时表重复此代码块,因此我更愿意将其放在一个过程中并使用表名称调用它:
EXEC [dbo].[CreateDebugTable]
@tableName = 'MyTempTable'
我想这个程序看起来像是:
CREATE PROCEDURE [dbo].[CreateDebugTable]
@tableName VARCHAR(50)
AS
BEGIN
IF OBJECT_ID('tempdb..#' + @tableName, 'U') IS NOT NULL
BEGIN
IF OBJECT_ID('dbo.Debug_' + @tableName, 'U') IS NOT NULL
DROP TABLE <Debug_TempTable>
SELECT * INTO <Debug_TempTable> FROM <#TempTable>
END
END
该过程取决于能够将OBJECT_ID
DebugTempTable
和#TempTable
翻译成实际表格(在上面的代码中以&lt;&gt;显示)。这可能吗?
[编辑]
这是使用sp_executesql
而不是显式表的更改过程。
CREATE PROCEDURE [dbo].[CreateDebugTable]
@tableName VARCHAR(50)
AS
BEGIN
DECLARE @tmpTable VARCHAR(50) = '#' + @tableName
DECLARE @dboTable VARCHAR(50) = 'Debug_' + @tableName
DECLARE @sql NVARCHAR(100)
IF OBJECT_ID('tempdb..' + @tmpTable, 'U') IS NOT NULL
BEGIN
IF OBJECT_ID('dbo.' + @dboTable, 'U') IS NOT NULL
BEGIN
SET @sql = 'DROP TABLE ' + @dboTable
EXECUTE sp_executesql @sql
END
SET @sql = 'SELECT * INTO ' + @dboTable + ' FROM ' + @tmpTable
EXECUTE sp_executesql @sql
END
END
答案 0 :(得分:2)
object_id
仅用作各种元数据视图中的键。根据{{1}}对象(或以其他方式操纵)对象TSQL
没有SELECT
语法。
如果您有一个object_id
,那么通常可以使用
object_id
要获取对象的2部分名称,但对于SELECT QUOTENAME(OBJECT_SCHEMA_NAME(@object_id[,database_id])) +
'.' +
QUOTENAME(OBJECT_NAME(@object_id[,database_id]) )
表,这将返回长内部名称,而不是您可以在查询中实际使用的短名称。