获取SQLCLR存储过程的T-SQL CREATE语句

Jos*_*ons 9 sql-server sqlclr generate-scripts

我有一个应用程序,使用sp_helptext检索存储过程的文本.它适用于 CLR存储过程之外的所有存储过程.如果我尝试sp_helptext在SQLCLR存储过程上使用,我会收到此错误:

对象'PROC_NAME'没有文字

我知道SSMS可以在我使用"script as" - >"create to" - >命令时执行此操作.

但是当我使用SQL Server Profiler跟踪SSMS"生成脚本"操作时,它给了我一个相当复杂的活动的令人生畏的长列表.如果必须的话,我可以通过它,但有没有人知道以编程方式获取CLR存储过程的代码的简单方法?

编辑以澄清
我不希望看到程序集中的实际代码; 我只想要一种简单的方法来查看T-SQL代码,如下例所示:

CREATE PROCEDURE [dbo].[MY_PROC]
    @PARAM1 [xml],
    @PARAM2 [uniqueidentifier],
    @PARAM3 [nvarchar](255),
    @PARAM4[bit] = False
WITH EXECUTE AS OWNER
AS
EXTERNAL NAME [SomeSolution.SomeProject].[SomeAssembly].[SomeMethod]
GO
Run Code Online (Sandbox Code Playgroud)

换句话说,SQLCLR函数的"SQL Server端".

小智 3

我遇到了同样的困境,并在网上一遍又一遍地搜索任何解决方案来获取 CLR 存储过程的代码。最后必须按照您所说的描述 SSMS“生成脚本”操作的作用,这就是我得到的:

--GET ALL CLR stored procedures
SELECT
sp.name AS [Name],
sp.object_id AS [object_ID],
case when amsp.object_id is null then N'''' else asmblsp.name end AS [AssemblyName],
case when amsp.object_id is null then N'''' else amsp.assembly_class end AS [ClassName],
case when amsp.object_id is null then N'''' else amsp.assembly_method end AS [MethodName]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.assembly_modules AS amsp ON amsp.object_id = sp.object_id
LEFT OUTER JOIN sys.assemblies AS asmblsp ON asmblsp.assembly_id = amsp.assembly_id
LEFT OUTER JOIN sys.procedures AS spp ON spp.object_id = sp.object_id
WHERE spp.type like 'PC'

--For each CLR SP get the parameters in use
SELECT
param.name AS [Name]
FROM
sys.all_objects AS sp
INNER JOIN sys.all_parameters AS param ON param.object_id=sp.object_id
WHERE sp.name like 'your_sp_name' order by param.parameter_id ASC

--For each parameter get the values, data type and so on...
SELECT
param.name AS [Name],
param.parameter_id AS [param_ID],
sp.object_id AS [object_ID],
param.default_value AS [DefaultValue],
usrt.name AS [DataType],
sparam.name AS [DataTypeSchema],
ISNULL(baset.name, N'''') AS [SystemType],
CAST(CASE WHEN baset.name IN (N'nchar', N'nvarchar') AND param.max_length <> -1 THEN         param.max_length/2 ELSE param.max_length END AS int) AS [Length],
CAST(param.precision AS int) AS [NumericPrecision],
CAST(param.scale AS int) AS [NumericScale]
FROM
sys.all_objects AS sp
INNER JOIN sys.all_parameters AS param ON param.object_id=sp.object_id
LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = param.user_type_id
LEFT OUTER JOIN sys.schemas AS sparam ON sparam.schema_id = usrt.schema_id
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = param.system_type_id and     baset.user_type_id = baset.system_type_id) 
WHERE param.name='@param1' and sp.name='your_sp_name'
Run Code Online (Sandbox Code Playgroud)

通过这个脚本,我制作了一个 Perl 脚本来为我生成代码。我想从这里您可以执行相同的操作或创建自己的存储过程来打印所需的代码。我不是 SQL 程序员,所以我不知道该怎么做,但如果有人对上述查询进行编程,请分享。