我在哪里可以在Microsoft SQL Server中找到CLR函数文本?

我在哪里可以在Microsoft SQL Server中找到CLR函数文本?

问题描述:

我创建了一个应用程序来同步具有相同结构的Microsoft SQL Server数据库。我需要解决的任务之一是将任何数据库例程(过程,函数,触发器等)从源数据库传输到目标数据库。对于常规转移我使用查询我在哪里可以在Microsoft SQL Server中找到CLR函数文本?

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库函数本身,我只是想传递在可编程性>函数>表值函数中手动创建的包装函数。

+0

CLR函数是在.NET中创建并在SQL服务器中注册的程序集(dll)。你可以从程序集sys.assemblies获取列表。所以你不会在SQL Server中获得CLR函数的文本定义。 –

+0

@RahulRichhariya,我不想传输CLR函数(= .NET库函数),我问了一个关于CLR_TABLE_VALUED_FUNCTION或CLR_SCALAR_FUNCTION的问题 - 可在Programmability> Functions> Table-valued Functions函数列表中找到的对象。您可以像编辑任何标准函数(SQL_SCALAR_FUNCTION)一样编辑和保存此对象。 – Dmitry

+0

因此,您试图生成“CREATE FUNCTION [dbo]”。[len_s](@str nvarchar(4000)) RETURNS bigint AS EXTERNAL NAME [SurrogateStringFunction]。[Microsoft.Samples.SqlServer 。.SurrogateStringFunction] [透镜];'? –

Server Profiler显示了35个不同的动态查询,由Management Studio用来构建CLR包装函数。因此,不幸的是,功能文本在运行中并且没有任何内容存储在系统数据库的深处。

如果您想查看CLR函数或过程,您需要执行一些步骤作为CLR函数,则会从程序集创建过程。

第1步: - 导出你的组件文件系统

步骤2: - 使用.NET程序集反编译像http://ilspy.net/或者红门反射器

如果组件创建者没有执行此方法编辑添加步骤以防止反编译。

+0

我不需要在数据库之间传输.NET库,我想要传递在Programmability> Functions> Table-valued Functions中创建的CLR包装函数。请看@ Damien_The_Unbeliever的评论,他明白了。 – Dmitry

+0

确定了你。你使用PowerShell或你想只使用SQL查询吗? –

+0

我更喜欢使用SQL查询,但我会非常感谢您提供的任何解决方案。但对我来说,听起来很奇怪,所有查询都位于'sys.sql_modules'数据表中,并且可以很容易地选择,并且需要使用PowerShell来提取CLR包装查询(它们看起来方式相同,可以用相同方式更改) 。 – Dmitry