Spalte sys.objects [Typ] seltsamer Wert 'ST'

8

Ich sehe einen seltsamen (nicht dokumentierten) Wert für die Spalte [Typ] in sys.objects. Der Wert ist "ST", wie unten gezeigt (Hinweis, dbo.Record ist eine Benutzertabelle).

Weiß jemand, was dieser 'ST'-Wert bedeutet? (Dies ist in SQL Server 2014 Developer Edition)

Geben Sie hier die Bildbeschreibung ein

jyao
quelle
Interessant. Eine ähnliche Frage wurde bereits im Mai in den MSDN-Foren gestellt: Was ist Type = ST in sys.objects? . Und das bezieht sich auch auf SQL Server 2014. Keine Antwort dort :-(
Solomon Rutzky
1
Verwenden Sie optionale Produktfunktionen, die möglicherweise relevant sind?
Martin Smith

Antworten:

3

Nun, ich weiß nicht, wofür ST steht, aber basierend auf der Namenskonvention müsste ich vermuten, dass es sich um eine Art systemgenerierte Statistik handelt.

Sie können überprüfen, ob dem Objekt zufällig eine Art Text zugeordnet ist, wenn es sich um ein Modul handelt, z.

SELECT OBJECT_DEFINITION(613577224);

SELECT definition FROM sys.all_sql_modules
  WHERE object_id = 613577224;

Sie könnten auch versuchen:

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

Schließlich können Sie versuchen, dieses Objekt in einer der Katalogansichten brutal zu entdecken. Dieses Skript versucht, eine Ansicht zu finden, die eine Zeile enthält, in der die object_idSpalte diesem Wert entspricht.

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;

Wenn dies nichts ergibt, können Sie es erweitern, um alle intSpalten in allen Katalogansichten einzuschließen, da manchmal object_idWerte in Spalten mit unterschiedlichen Namen wie referenced_major_idoder gespeichert werden parent_object_idund die Ergebnisse hier möglicherweise auch Hinweise liefern.

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
quelle
Danke Aaron, ich werde später etwas rennen und mich melden. Aber object_definition () und select * aus sys.all_modules geben entweder null oder nichts zurück. Ich erwarte auch, dass dies etwas mit Statistik zu tun hat. Gemäß der Namenskonvention für Statistiken bedeutet WA_xxx "Washington", _ST kann SEATTLE bedeuten. :-)
Jyao