sys.objects 列 [Type] 奇怪的值 'ST'

jya*_*yao 10 sql-server datatypes metadata sql-server-2014

我在 sys.objects 中看到 [Type] 列的奇怪(未记录)值。值为“ST”,如下图(注意,dbo.Record 是一个用户表)

有谁知道这个“ST”值是什么意思?(这是在 SQL Server 2014 开发版中)

在此处输入图片说明

Aar*_*and 4

好吧,我不知道 ST 代表什么,但根据命名约定,我不得不猜测它是某种系统生成的统计数据。

如果对象是模块,您可以检查是否偶然存在与该对象关联的某种文本,例如:

SELECT OBJECT_DEFINITION(613577224);

SELECT definition FROM sys.all_sql_modules
  WHERE object_id = 613577224;
Run Code Online (Sandbox Code Playgroud)

您还可以尝试:

EXEC sp_help N'dbo._ST_OEA33...';
Run Code Online (Sandbox Code Playgroud)

最后,您可以尝试在任何目录视图中强力发现该对象。此脚本尝试查找包含行且object_id列等于该值的任何视图。

CREATE TABLE #v(v sysname);

DECLARE @sql nvarchar(max) = N'', @obj int = 613577224;

SELECT @sql += N'INSERT #v 
    SELECT DISTINCT ''sys.' + name + N''' 
      FROM sys.' + QUOTENAME(name) + N' 
      WHERE [object_id] = @obj;'
  FROM sys.all_views AS v
  WHERE EXISTS 
  (
    SELECT 1 
      FROM sys.all_columns AS c
      WHERE c.name = N'object_id' 
      AND c.[object_id] = v.[object_id]
  ); 

EXEC sys.sp_executesql @sql, N'@obj int', @obj;

SELECT v FROM #v;

DROP TABLE #v;
Run Code Online (Sandbox Code Playgroud)

如果这没有产生任何结果,您可以将其扩展为包括int所有目录视图中基于 all 的列,因为有时object_id值存储在具有不同名称的列中,例如referenced_major_idparent_object_id,并且此处的任何结果也可能会产生线索。

SET NOCOUNT ON;

CREATE TABLE #v(v sysname);

DECLARE @sql nvarchar(max) = N'', @obj int = 613577224;

SELECT @sql += N'INSERT #v 
    SELECT DISTINCT ''sys.' + v.name + N''' 
      FROM sys.' + QUOTENAME(v.name) + N' 
      WHERE ' + QUOTENAME(c.name) + N' = @obj;'
  FROM sys.all_views AS v
  INNER JOIN sys.all_columns AS c
  ON v.[object_id] = c.[object_id]
  WHERE v.[schema_id] = 4
    AND c.[system_type_id] IN (56,127)
    AND v.name NOT IN (N'syscolumns')
    AND v.name NOT LIKE N'dm_fts_%'; 

EXEC sys.sp_executesql @sql, N'@obj int', @obj;

SELECT v FROM #v;

GO
DROP TABLE #v;
Run Code Online (Sandbox Code Playgroud)