在哪里可以找到 Microsoft SQL 服务器中的 CLR 函数文本?
Where can I find CLR function text in Microsoft SQL Server?
我创建了一个应用程序来同步具有相同结构的 Microsoft SQL 服务器数据库。我需要解决的任务之一是将任何数据库例程(过程、函数、触发器等)从源数据库传输到目标数据库。对于常规传输,我使用查询
SELECT [definition] FROM sys.sql_modules WITH (NOLOCK) WHERE object_id = OBJECT_ID('SOME_OBJECT_ID')
或
SELECT * FROM INFORMATION_SCHEMA.ROUTINES where routine_name like '%SOME_ROUTINE_NAME%'
并且它适用于除 CLR 函数(具有 [type_desc] = CLR_TABLE_VALUED_FUNCTION
或 [type_desc] = CLR_SCALAR_FUNCTION
的函数)之外的所有例程。
他们的文本未存储在 sys.sql_modules
数据表和系统视图中 INFORMATION_SCHEMA.ROUTINES
包含值 [ROUTINE_BODY] = EXTERNAL
和 [ROUTINE_DEFINITION] = NULL
。
但我确信 CLR 函数文本不会在我每次打开它时重新创建,因为它可以随着用户更改而更改和保存。
因此,如果能提供有关 CLR 函数文本位置的任何提示,我将不胜感激。
更新:我不需要传输 .NET 库函数本身,我只想传输在可编程性 > 函数 > Table 值函数中手动创建的包装函数。
如果您想查看 CLR 函数或过程,您需要执行一些步骤,因为 CLR 函数是从程序集创建过程的。
第 1 步:- 将程序集导出到文件系统
- 使用 powershell -http://www.sqlservercentral.com/blogs/erichumphrey/2012/03/02/extract-clr-assemblies-from-sql-server/
- 通过创建另一个 CLR 程序集 - https://www.mssqltips.com/sqlservertip/3126/exporting-clr-assemblies-from-sql-server-back-to-dll-files/
第 2 步:- 使用 .net 程序集反编译器,如 http://ilspy.net/ 或 redgate reflector
如果程序集创建者没有执行添加步骤来防止反编译,则此方法将有效。
Server Profiler 显示了 Management Studio 用来构建 CLR 包装函数的 35 个不同的动态查询。不幸的是,函数文本是即时构建的,没有任何内容存储在系统数据库的深处。
我创建了一个应用程序来同步具有相同结构的 Microsoft SQL 服务器数据库。我需要解决的任务之一是将任何数据库例程(过程、函数、触发器等)从源数据库传输到目标数据库。对于常规传输,我使用查询
SELECT [definition] FROM sys.sql_modules WITH (NOLOCK) WHERE object_id = OBJECT_ID('SOME_OBJECT_ID')
或
SELECT * FROM INFORMATION_SCHEMA.ROUTINES where routine_name like '%SOME_ROUTINE_NAME%'
并且它适用于除 CLR 函数(具有 [type_desc] = CLR_TABLE_VALUED_FUNCTION
或 [type_desc] = CLR_SCALAR_FUNCTION
的函数)之外的所有例程。
他们的文本未存储在 sys.sql_modules
数据表和系统视图中 INFORMATION_SCHEMA.ROUTINES
包含值 [ROUTINE_BODY] = EXTERNAL
和 [ROUTINE_DEFINITION] = NULL
。
但我确信 CLR 函数文本不会在我每次打开它时重新创建,因为它可以随着用户更改而更改和保存。
因此,如果能提供有关 CLR 函数文本位置的任何提示,我将不胜感激。
更新:我不需要传输 .NET 库函数本身,我只想传输在可编程性 > 函数 > Table 值函数中手动创建的包装函数。
如果您想查看 CLR 函数或过程,您需要执行一些步骤,因为 CLR 函数是从程序集创建过程的。
第 1 步:- 将程序集导出到文件系统
- 使用 powershell -http://www.sqlservercentral.com/blogs/erichumphrey/2012/03/02/extract-clr-assemblies-from-sql-server/
- 通过创建另一个 CLR 程序集 - https://www.mssqltips.com/sqlservertip/3126/exporting-clr-assemblies-from-sql-server-back-to-dll-files/
第 2 步:- 使用 .net 程序集反编译器,如 http://ilspy.net/ 或 redgate reflector
如果程序集创建者没有执行添加步骤来防止反编译,则此方法将有效。
Server Profiler 显示了 Management Studio 用来构建 CLR 包装函数的 35 个不同的动态查询。不幸的是,函数文本是即时构建的,没有任何内容存储在系统数据库的深处。