2010-07-01 3 views
27

Вопрос: В SQL Server 2005, как я могу перечислить все SQL CLR-функции/процедуры, которые используют сборку xy (например, MyFirstUdp)?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

Просто FYI: определяемые пользователем типы (UDT) находятся в 'sys.assembly_types' и не в' sys.assembly_modules'. –

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, которые были , используемые в CR EATE. Вы не можете найти методы CLR, которые имеют еще не ссылаются на CREATE. Смысл, вы не можете сказать: «Дайте мне список методов в этой сборке, которые я могу создать 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 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 
0

или вы можете использовать SELECT * FROM sys.dm_clr_appdomains; который возвращает список сборок и в какой базе данных они хранятся.

T

 Смежные вопросы

  • Нет связанных вопросов^_^