我创建了一个应用程序来同步具有相同结构的Microsoft SQL Server数据库。我需要解决的任务之一是将任何数据库例程(过程,函数,触发器等)从源数据库传输到目标数据库。对于例行转移,我使用查询
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库函数本身,我只想传输在Programmability>中手动创建的包装函数。功能>表值函数。
答案 0 :(得分:0)
如果要查看CLR函数或过程,需要执行一些步骤作为CLR函数,从程序集创建过程。
步骤1: - 将程序集导出到文件系统
步骤2: - 使用.net程序集反编译器,如http://ilspy.net/或红门反射器
如果程序集创建者未执行添加步骤以防止反编译,则此方法将起作用。
答案 1 :(得分:0)
Server Profiler显示了Management Studio用于构建CLR包装器功能的35种不同动态查询。因此,不幸的是,功能文本是即时构建的,没有任何内容存储在系统数据库的深处。