37

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

例如,为查询参数 MyFirstUdp 列出 HelloWorld 的函数

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

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

4

6 回答 6

55

查看sys.assembly_modules视图:

select * from sys.assembly_modules

这应该列出所有函数和定义它们的程序集。请参阅联机丛书帮助页面

为公共语言运行时 (CLR) 程序集定义的每个函数、过程或触发器返回一行。

于 2010-07-01T06:40:40.650 回答
17

我使用以下 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. 您只能列出已在CREATE { PROCEDURE | FUNCTION | AGGREGATE | TRIGGER | TYPE } 语句中使用的 SQLCLR 引用。您找不到尚未被CREATE​​ . 意思是,你不能说:“给我这个程序集中的方法列表,我可以为其创建 T-SQL 对象”。

有关一般使用 SQLCLR 的更多信息,请访问:SQLCLR 信息

于 2011-01-22T16:06:04.703 回答
6

这是在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 对象的所有位置。

于 2014-02-04T07:35:57.423 回答
6

这是 srutzky 查询(上图)的概括,它使用游标遍历服务器上的所有数据库。对格式感到抱歉,但是如果您必须搜索您继承的 500 个 DB,这很方便。

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
于 2015-11-10T00:31:53.790 回答
1

或者你可以使用

SELECT * FROM sys.dm_clr_appdomains;

它返回程序集列表以及它们存储在哪个数据库中。

于 2017-03-10T11:30:12.397 回答
1
SELECT 
      modules.assembly_class AS AssemblyClass,
      modules.assembly_method AS MethodName,
      obj.type_desc AS MethodType,
      files.name AS FilePath,
      assemb.name AS AssemblyName,
      assemb.clr_name,
      assemb.create_date,
      assemb.modify_date,
      assemb.permission_set_desc
      --,*
FROM   
     sys.assembly_modules AS modules
     JOIN sys.assembly_files AS files ON files.assembly_id = modules.assembly_id
     JOIN sys.assemblies AS assemb ON assemb.assembly_id = modules.assembly_id
     JOIN sys.objects AS obj ON obj.object_id = modules.object_id
于 2019-12-30T13:47:20.343 回答