2010-07-01 9 views
27

Question: Dans SQL Server 2005, comment puis-je lister tous SQL CLR-fonctions/procédures qui utilisent l'assemblage xy (par exemple MyFirstUdp)?SQL Server: Comment lister toutes les fonctions CLR/procédures/objets pour l'assemblage

Par exemple, une fonction qui répertorie HelloWorld pour le paramètre de requête MyFirstUdp

CREATE PROCEDURE HelloWorld 
AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].HelloWorld 
GO 

après avoir couru

CREATE ASSEMBLY MyFirstUdp FROM 'C:\Users\username\Documents\Visual Studio 2005\Projects\SQL_CLRdll\SQL_CLRdll\bin\Debug\SQL_CLRdll.dll 

Je peux énumérer tous les modules et toutes les fonctions/procédures, mais il me semble incapable d'associer l'Assemblée aux fonctions/procédures ...

Répondre

40

Vérifiez la vue sys.assembly_modules:

select * from sys.assembly_modules 

Ceci devrait lister toutes les fonctions et les assemblages dans lesquels elles sont définies. Voir le Books Online help page à ce propos.

renvoie une ligne pour chaque fonction, procédure ou de déclenchement qui est défini par un moteur d'exécution de langage commun (CLR) d'assemblage .

+5

Juste Pour votre information: Types définis par l'utilisateur (UDT) se trouvent dans 'sys.assembly_types' et non pas dans' sys.assembly_modules'. –

7

J'utilise l'instruction SQL suivante:

SELECT  so.name AS [ObjectName], 
      so.[type], 
      SCHEMA_NAME(so.[schema_id]) AS [SchemaName], 
      asmbly.name AS [AssemblyName], 
      asmbly.permission_set_desc, 
      am.assembly_class, 
      am.assembly_method 
FROM  sys.assembly_modules am 
INNER JOIN sys.assemblies asmbly 
     ON asmbly.assembly_id = am.assembly_id 
     AND asmbly.is_user_defined = 1 -- if using SQL Server 2008 or newer 
--  AND asmbly.name NOT LIKE 'Microsoft%' -- if using SQL Server 2005 
INNER JOIN sys.objects so 
     ON so.[object_id] = am.[object_id] 
UNION ALL 
SELECT  at.name AS [ObjectName], 
      'UDT' AS [type], 
      SCHEMA_NAME(at.[schema_id]) AS [SchemaName], 
      asmbly.name AS [AssemblyName], 
      asmbly.permission_set_desc, 
      at.assembly_class, 
      NULL AS [assembly_method] 
FROM  sys.assembly_types at 
INNER JOIN sys.assemblies asmbly 
     ON asmbly.assembly_id = at.assembly_id 
     AND asmbly.is_user_defined = 1 -- if using SQL Server 2008 or newer 
--  AND asmbly.name NOT LIKE 'Microsoft%' -- if using SQL Server 2005 
ORDER BY [AssemblyName], [type], [ObjectName] 

S'il vous plaît noter:

  1. Types définis par l'utilisateur (UDT) se trouvent dans : sys.assembly_types

  2. Vous ne peut que liste les références CLR qui ont été utilisées en CR Les instructions EATE Vous ne pouvez pas trouver les méthodes CLR qui ont pas encore été référencé par un CREATE. Signification, vous ne pouvez pas dire: "donnez-moi une liste des méthodes dans cet assemblage que je peux créer objets SQL pour".

3

Ici, il un script trouvé sur sqlhint.com:

SELECT 
     SCHEMA_NAME(O.schema_id) AS [Schema], O.name, 
     A.name AS assembly_name, AM.assembly_class, 
     AM.assembly_method, 
     A.permission_set_desc, 
     O.[type_desc] 
FROM 
     sys.assembly_modules AM 
     INNER JOIN sys.assemblies A ON A.assembly_id = AM.assembly_id 
     INNER JOIN sys.objects O ON O.object_id = AM.object_id 
ORDER BY 
     A.name, AM.assembly_class 

, vous avez également la possibilité de voir tous les endroits où ce CLR object is used.

1

Voici une généralisation de la requête de srutzky (ci-dessus) qui passe par tous les blocs de données sur un serveur à l'aide d'un curseur. Désolé pour le formatage, mais c'est pratique si vous devez effectuer une recherche parmi les 500 BD dont vous avez hérité.

set nocount on 
declare @cmd nvarchar(4000) 

declare curDBs cursor read_only for 
    SELECT name FROM MASTER.sys.sysdatabases 
declare @NameDB nvarchar(100) 

create table #tmpResults (
     DatabaseName nvarchar(128) 
    , ObjectName nvarchar(128) 
    , ObjectType char(2) 
    , SchemaName nvarchar(128) 
    , AssemblyName nvarchar(128) 
    , PermissionSet nvarchar(60)       
    , AssemblyClass nvarchar(128) 
    , AssemblyMethod nvarchar(128)); 

open curDBs; while (1=1) 
    begin 
     fetch next from curDBs into @NameDB 
     if @@fetch_status <> 0 break 
     set @cmd = N' 
      USE [' + @NameDB + N']; 
      begin try 
      insert into #tmpResults 
       SELECT  ''' + @NameDB + N''', 
          so.name AS [ObjectName], 
          so.[type], 
          SCHEMA_NAME(so.[schema_id]) AS [SchemaName], 
          asy.name AS [AssemblyName], 
          asy.permission_set_desc, 
          am.assembly_class, 
          am.assembly_method 
        FROM sys.assembly_modules am 
         INNER JOIN sys.assemblies asy 
          ON asy.assembly_id = am.assembly_id 
           AND asy.is_user_defined = 1 
         INNER JOIN sys.objects so 
          ON so.[object_id] = am.[object_id] 
      UNION ALL 
       SELECT  ''' + @NameDB + N''', 
          at.name AS [ObjectName], 
          ''UDT'' AS [type], 
          SCHEMA_NAME(at.[schema_id]) AS [SchemaName], 
          asy.name AS [AssemblyName], 
          asy.permission_set_desc, 
          at.assembly_class, 
          NULL AS [assembly_method] 
        FROM sys.assembly_types at 
         INNER JOIN sys.assemblies asy 
          ON asy.assembly_id = at.assembly_id 
           AND asy.is_user_defined = 1 
        ORDER BY [AssemblyName], [type], [ObjectName] 
       print ''' + @NameDB + N' ' + cast(@@rowcount as nvarchar) + N''' 
      end try 
      begin catch 
       print ''Error processing ' + @NameDB + ''' 
      end catch 
     ' 
     --print @cmd 
     EXEC sp_executesql @cmd 
    end 
close curDBs; deallocate curDBs 

select * from #tmpResults 
drop table #tmpResults 
0

ou vous pouvez utiliser SELECT * FROM sys.dm_clr_appdomains; qui renvoie une liste d'assemblées et dans quelle base de données elles sont stockées.

T