Colonna sys.objects [Tipo] strano valore 'ST'


9

Sto vedendo uno strano valore (non documentato) per la colonna [Tipo] in sys.objects. Il valore è "ST" come mostrato di seguito (nota, dbo.Record è una tabella utente)

Qualcuno sa cosa significa questo valore "ST"? (Questo è in SQL Server 2014 Developer Edition)

inserisci qui la descrizione dell'immagine


Interessante. Una domanda simile è stata inviata ai forum MSDN a maggio: che cos'è Type = ST in sys.objects? . E quello si riferisce anche a SQL Server 2014. Nessuna risposta lì, però :-(
Solomon Rutzky

1
Stai utilizzando funzionalità di prodotto opzionali che potrebbero essere pertinenti?
Martin Smith,

mi sono imbattuto anche in questo tyoe, in SQL Server 2017. Quando ho eseguito un controllo su tutti i DB sui server, ce n'erano centinaia.
user3593990

Risposte:


3

Beh, non so che cosa significhi ST, ma sulla base della convenzione di denominazione dovrei indovinare che è una sorta di statistica generata dal sistema.

È possibile verificare se esiste, per caso, un tipo di testo associato all'oggetto se si tratta di un modulo, ad esempio:

SELECT OBJECT_DEFINITION(613577224);

SELECT definition FROM sys.all_sql_modules
  WHERE object_id = 613577224;

Puoi anche provare:

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

Infine, potresti provare a scoprire la forza di questo oggetto in qualsiasi vista del catalogo. Questo script tenta di trovare qualsiasi vista che contenga una riga in cui la object_idcolonna è uguale a quel valore.

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 questo non produce nulla, è possibile espanderlo per includere tutte le intcolonne basate su tutte le viste del catalogo, poiché a volte i object_idvalori sono memorizzati in colonne con nomi diversi, come referenced_major_ido parent_object_id, e qualsiasi risultato qui può fornire anche indizi.

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;

Grazie Aaron, darò un po 'di tempo dopo e riferirò. Ma object_definition () e selezionare * da sys.all_modules restituiscono null o null. Mi aspetto anche che ciò abbia a che fare con le statistiche, secondo la convenzione di denominazione delle statistiche, WA_xxx significa "Washington", _ST può significare SEATTLE? :-)
jyao
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.