SQL Server:如何列出所有CLR函数/过程/对象以进行汇编

Ste*_*ger 30 sql-server sql-server-2005 sqlclr

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

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

CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.[SQL_CLRdll.MySQLclass].HelloWorld
GO
Run Code Online (Sandbox Code Playgroud)

我跑了之后

CREATE ASSEMBLY MyFirstUdp FROM 'C:\Users\username\Documents\Visual Studio 2005\Projects\SQL_CLRdll\SQL_CLRdll\bin\Debug\SQL_CLRdll.dll
Run Code Online (Sandbox Code Playgroud)

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

mar*_*c_s 44

查看sys.assembly_modules视图:

select * from sys.assembly_modules
Run Code Online (Sandbox Code Playgroud)

这应列出所有功能及其定义的程序集.请参阅联机丛书帮助页面.

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

  • 仅供参考:用户定义类型(UDT)可在`sys.assembly_types`中找到,而不是在`sys.assembly_modules`中找到. (7认同)

Sol*_*zky 8

我使用以下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]
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 用户定义类型(UDT)位于:sys.assembly_types中

  2. 您只能列出已在CREATE语句中使用的CLR引用.您找不到CREATE尚未引用的CLR方法.意思是,你不能说:"给我一个方法列表,我可以为这个程序集创建SQL对象".


Mih*_*riu 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
Run Code Online (Sandbox Code Playgroud)

此外,您还可以选择查看使用CLR 对象的所有位置。


Jef*_*den 6

这是 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
Run Code Online (Sandbox Code Playgroud)