coluna sys.objects [Tipo] valor estranho 'ST'

9

Estou vendo um valor estranho (não documentado) para a coluna [Type] em sys.objects. O valor é "ST", conforme mostrado abaixo (observe: dbo.Record é uma tabela do usuário)

Alguém sabe o que esse valor 'ST' significa? (Isso está no SQL Server 2014 Developer Edition)

insira a descrição da imagem aqui

jyao
fonte
Interessante. Pergunta semelhante foi postada nos fóruns do MSDN em maio: O que é o Type = ST no sys.objects? . E isso também está relacionado ao SQL Server 2014. Porém, não há resposta :-(
Solomon Rutzky 17/17/17
11
Você está usando algum recurso opcional do produto que possa ser relevante?
Martin Smith
Também encontrei esse tyoe no SQL Server 2017. Quando executei uma verificação em todos os bancos de dados nos servidores, havia centenas deles.
user3593990

Respostas:

3

Bem, eu não sei o que ST significa, mas com base na convenção de nomenclatura eu teria que adivinhar que é algum tipo de estatística gerada pelo sistema.

Você pode verificar se há, por acaso, algum tipo de texto associado ao objeto, se for um módulo, por exemplo:

SELECT OBJECT_DEFINITION(613577224);

SELECT definition FROM sys.all_sql_modules
  WHERE object_id = 613577224;

Você também pode tentar:

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

Por fim, você pode tentar com força bruta descobrir esse objeto em qualquer uma das visualizações de catálogo. Este script tenta encontrar qualquer exibição que contenha uma linha em que a object_idcoluna seja igual a esse valor.

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;

Se isso não resultar em nada, você poderá expandi-lo para incluir intcolunas com base em todas as visualizações de catálogo, pois algumas vezes os object_idvalores são armazenados em colunas com nomes diferentes, como referenced_major_idou parent_object_id, e qualquer resultado aqui também pode fornecer pistas.

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;
Aaron Bertrand
fonte
Obrigado Aaron, vou dar uma corrida mais tarde e relatar de volta. Mas object_definition () e selecione * de sys.all_modules retornam nulo ou nada. Eu também espero que isso tenha algo a ver com estatísticas, de acordo com a convenção de nomenclatura estatística, WA_xxx significa "Washington", _ST pode significar SEATTLE? :-)
jyao 17/11