Colonne sys.objects [Type] valeur bizarre 'ST'

9

Je vois une valeur étrange (non documentée) pour la colonne [Type] dans sys.objects. La valeur est "ST" comme indiqué ci-dessous (note, dbo.Record est une table utilisateur)

Quelqu'un sait-il ce que signifie cette valeur «ST»? (Ceci est dans SQL Server 2014 Developer Edition)

entrez la description de l'image ici

jyao
la source
Intéressant. Une question similaire a été publiée sur les forums MSDN en mai: Qu'est-ce que Type = ST dans sys.objects? . Et, celui-ci concerne également SQL Server 2014. Aucune réponse là-bas, cependant :-(
Solomon Rutzky
1
Utilisez-vous des fonctionnalités optionnelles du produit qui pourraient être pertinentes?
Martin Smith
J'ai également rencontré ce tyoe, dans SQL Server 2017. Lorsque j'ai effectué une vérification sur toutes les bases de données sur les serveurs, il y en avait des centaines.
user3593990

Réponses:

3

Eh bien, je ne sais pas ce que ST représente, mais d'après la convention de dénomination, je devrais deviner que c'est une sorte de statistique générée par le système.

Vous pouvez vérifier s'il existe, par hasard, une sorte de texte associé à l'objet s'il s'agit d'un module, par exemple:

SELECT OBJECT_DEFINITION(613577224);

SELECT definition FROM sys.all_sql_modules
  WHERE object_id = 613577224;

Vous pouvez également essayer:

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

Enfin, vous pouvez essayer de forcer la découverte de cet objet dans l'une des vues de catalogue. Ce script essaie de trouver n'importe quelle vue contenant une ligne où la object_idcolonne est égale à cette valeur.

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;

Si cela ne donne rien, vous pouvez l'étendre pour inclure toutes les intcolonnes basées sur toutes les vues de catalogue, car parfois les object_idvaleurs sont stockées dans des colonnes avec des noms différents, comme referenced_major_idou parent_object_id, et tous les résultats ici peuvent également fournir des indices.

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
la source
Merci Aaron, je vais faire un tour plus tard et faire un rapport. Mais object_definition () et sélectionnez * dans sys.all_modules renvoient null ou rien. Je m'attends également à ce que cela ait quelque chose à voir avec les statistiques, selon la convention de dénomination des statistiques, WA_xxx signifie "Washington", _ST peut signifier SEATTLE? :-)
jyao