Метаданные табличных переменных также доступны для просмотра в tempdb.sys.tables
. Это легко проверить из приведенного ниже
declare @t2 as table ( [38F055D8-25D9-4AA6-9571-F436FE] int)
SELECT t.name, t.object_id
FROM tempdb.sys.tables t
JOIN tempdb.sys.columns c
ON t.object_id = c.object_id
WHERE c.name = '38F055D8-25D9-4AA6-9571-F436FE'
Пример результатов
name object_id
------------------------------ -----------
#4DB4832C 1303675692
Но вы заметите, что имя объекта генерируется автоматически и не имеет никакого отношения к имени переменной.
Если у вас нет гарантированного уникального имени столбца, которое вы можете использовать для фильтрации, как указано выше, и у переменной таблицы есть хотя бы одна строка, которую вы можете (начиная с SQL Server 2008 и далее) использовать %%physloc%%
и DBCC PAGE
определить эту информацию. Пример ниже.
DECLARE @t2 AS TABLE ( a INT)
INSERT INTO @t2
VALUES (1)
DECLARE @DynSQL NVARCHAR(100)
SELECT TOP (1) @DynSQL = 'DBCC PAGE(2,' + CAST(file_id AS VARCHAR) + ',' +
CAST( page_id AS VARCHAR) +
',1) WITH TABLERESULTS'
FROM @t2
CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
DECLARE @DBCCPage TABLE (
[ParentObject] [VARCHAR](100) NULL,
[Object] [VARCHAR](100) NULL,
[Field] [VARCHAR](100) NULL,
[VALUE] [VARCHAR](100) NULL )
INSERT INTO @DBCCPage
EXEC (@DynSQL)
SELECT VALUE AS object_id,
OBJECT_NAME(VALUE, 2) AS object_name
FROM @DBCCPage
WHERE Field = 'Metadata: ObjectId'