sys.objects column [Тип] странное значение 'ST'

9

Я вижу странное (недокументированное) значение для столбца [Type] в sys.objects. Значение «ST», как показано ниже (обратите внимание, dbo.Record - это пользовательская таблица)

Кто-нибудь знает, что означает это значение «ST»? (Это в SQL Server 2014 Developer Edition)

введите описание изображения здесь

jyao
источник
Интересно. Еще один вопрос был отправлен на форумы MSDN еще в мае: что такое Type = ST в sys.objects? , И это также относится к SQL Server 2014. Там нет ответа, однако :-(
Соломон Руцкий
1
Используете ли вы какие-либо дополнительные функции продукта, которые могут иметь отношение к делу?
Мартин Смит
Я также столкнулся с этим tyoe в SQL Server 2017. Когда я проверил проверку всех БД на серверах, их было сотни.
user3593990

Ответы:

3

Ну, я не знаю, что означает ST, но исходя из соглашения об именах, я должен был бы предположить, что это какая-то сгенерированная системой статистика.

Вы можете проверить, есть ли случайно какой-то текст, связанный с объектом, если это модуль, например:

SELECT OBJECT_DEFINITION(613577224);

SELECT definition FROM sys.all_sql_modules
  WHERE object_id = 613577224;

Вы также можете попробовать:

EXEC sp_help N'dbo._ST_OEA33...';

Наконец, вы можете попытаться грубо обнаружить этот объект в любом из представлений каталога. Этот скрипт пытается найти любое представление, содержащее строку, 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;

Если это ничего не дает, вы можете расширить его, включив в него все intстолбцы на основе всех представлений каталога, поскольку иногда object_idзначения хранятся в столбцах с разными именами, такими как referenced_major_idили parent_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;
Аарон Бертран
источник
Спасибо, Аарон, я немного побегу позже и доложу. Но object_definition () и select * from sys.all_modules возвращают либо ноль, либо ничего. Я также ожидаю, что это как-то связано со статистикой, согласно соглашению об именах статистики, WA_xxx означает «Вашингтон», _ST может означать SEATTLE? :-)
Jyao