2010-07-01 37 views
27

问题:在SQL Server 2005中,如何列出使用程序集xy(例如MyFirstUdp)的所有SQL CLR函数/过程?SQL Server:如何列出用于汇编的所有CLR函数/过程/对象

例如列出HelloWorld的查询参数MyFirstUdp

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

后,我跑

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

我可以列出所有组件和所有功能/程序, 功能,但我似乎无法将程序集与函数/程序相关联...

回答

40

检出sys.assembly_modules查看:

select * from sys.assembly_modules 

这应该列出所有功能及其定义的组件。请参阅Books Online help page

返回一行的每个功能, 过程或触发器由公共语言运行库(CLR) 组件限定 。

+5

仅供参考:用户定义类型(UDT)在'sys.assembly_types'被发现,而不是在'sys.assembly_modules'。 – 2015-05-28 16:33:33

7

我用下面的SQL:

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] 

请注意:

  1. 用户定义类型(UDT)被发现在 :sys.assembly_types

  2. 你只能使用 列表中已使用的CLR参考文件 EATE语句。您 无法找到尚未被CREATE引用的CLR方法 。 含义,你不能说:“给我一个 在这个程序集中的方法列表,我可以创建 SQL对象”。

3

这一个脚本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 

此外,你必须看到所有的地方,那CLR object is used的选项。

1

这里是srutzky的查询(上面)的概括,该查询遍历服务器上使用游标的所有数据库。对格式化抱歉,但如果您必须搜索您已继承的500个数据库,那么这很方便。

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

或者您可以使用SELECT * FROM sys.dm_clr_appdomains;它返回程序集列表以及它们存储在哪个数据库中。

牛逼

相关问题