2011-06-15 3 views
2

J'essaye de lister toutes les procédures stockées de toutes les bases de données sur mon serveur, et je ne peux pas sembler filtrer des objets de système de manière fiable. J'utilisais:Comment identifier les objets système lors de l'affichage de la liste des objets de base de données SQL Server?

SELECT * 
    FROM sysobjects 
WHERE id > 100 

Ce qui semble fonctionner correctement dans chaque base de données, sauf MSDB, qui est plein d'une tonne de procs stockées avec des ID aspect normal, mais ils sont stockés système procs. Pour autant que je sache, il n'y a aucun moyen pour moi de filtrer les processus stockés du système en utilisant l'une des valeurs de la table sysobjects - quelqu'un d'autre sait-il une valeur qui peut être utilisée pour filtrer?

Ils sont tous marqués comme type = "P", ce qui signifie qu'il s'agit d'un proc stocké, mais il ne semble pas y avoir d'indicateur pour spécifier s'il s'agit d'un proc système stocké ou d'un utilisateur. Je peux utiliser la vue sys.objects et filtrer pour "IsMsShipped = 0", mais je voudrais quelque chose qui fonctionne aussi sur SQL 2000, donc je préfère utiliser les anciennes vues (comme sysobjects) si c'est possible.

Répondre

5

Cela fonctionne sur mon installation de SQL Server 2008 R2. Je ne vois pas grand-chose à tous, sauf pour les bases de données utilisateur

SELECT 
    * 
FROM 
    sys.objects 
WHERE 
    OBJECTPROPERTY(object_id, 'IsMSShipped') = 0 

Vous pouvez changer sys.objects dire, sys.tables et il fonctionne encore, ou utiliser la colonne « type » pour filtrer. Ou utilisez OBJECTPROPERTY (object_id, 'IsProcedure'), etc.

Note: il est sys.objects dans SQL Server 2005+

Note 2: OBJECTPROPERTY fonctionnera pour SQL Server 2000 aussi:

SELECT 
    * 
FROM 
    sysobjects 
WHERE 
    OBJECTPROPERTY(id, 'IsMSShipped') = 0 
+0

C'est peut-être ce que je dois faire, car j'ai remarqué cette propriété dans la nouvelle vue du système, mais je tiens à espérer qu'il existe une propriété facilement accessible qui fonctionne aussi en 2000. – SqlRyan

+0

er ... OBJECTPROPERTY est aussi dans SQL Server 2000 http://msdn.microsoft.com/en-us/library/aa276849(SQL.80).aspx – gbn

+0

Hmm - c'est sûr, et je viens de confirmer que mon script fonctionne toujours sur un serveur 2000. Merci de votre aide! – SqlRyan

2

SQL Server 2005 et plus

SELECT 
    SCHEMA_NAME(obj.schema_id) AS schema_name, 
    obj.name AS proc_name 
FROM 
    sys.procedures obj WITH(NOLOCK) 
ORDER BY 
    schema_name, 
    proc_name 

SQL Server 2000

SELECT 
    USER_NAME(obj.uid) AS user_name, 
    obj.name AS proc_name, 
FROM 
    sysobjects obj WITH(NOLOCK) 
WHERE 
    (obj.status & 0x80000000) = 0 
    AND RTRIM(obj.xtype) IN ('P', 'RF') 
ORDER BY 
    user_name, 
    proc_name 
Questions connexes