如何向 SQL CLR 函数添加注释?

How to add comments to SQL CLR function?

我想为我的 SQL CLR 函数添加注释(正如我对我正在创建或编辑的其他 SQL 对象所做的那样 - 函数、过程和视图)。不幸的是,我无法为 SQL CLR 个对象执行此操作。

例如下面的代码:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =================================================================================================================================
-- Author:          gotqn
-- Create date:     2015-03-25
-- Description:     Converts a string that has been encoded for transmission in a URL into a decoded string.
-- Usage Example: 
/*
                    SELECT [dbo].[fn_UrlDecode]('http://whosebug.com/search?q=tql+sql+server');
*/    
-- =================================================================================================================================
CREATE FUNCTION [dbo].[fn_UrlDecode] (@value NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME [Utils].[Utils].[UrlDecode]
GO

当函数是来自 SQL Management studio 的脚本时,将生成此:

SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER OFF
GO

CREATE FUNCTION [dbo].[fn_UrlDecode](@value [nvarchar](max))
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [Utils].[Utils].[UrlDecode]
GO

我尝试修复此问题,将评论部分移到 AS 之后,因为这是为视图添加评论的方式,但它再次失败。然后我尝试将注释放在 CREATE 子句之后,EXTERNAL NAME ... 子句之后,但没有任何改变。

有没有办法解决这个问题?

这是预期的行为。即使当您编写一个在例程签名之前添加注释的本机 TSQL 脚本时,针对 DBMS 构建它并执行正确的 click/edit 以查看注释不会存在的代码。继续尝试这种方法:

CREATE FUNCTION [dbo].[fn_UrlDecode]
(
   @value [nvarchar](max)
)
RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
AS 
/*
  ***All the comments goes here***
*/
EXTERNAL NAME [Utils].[Utils].[UrlDecode]
GO

希望对您有所帮助!

基本上,如果它是一种未列为在 sys.sql_modules 中存储数据的类型,则不会保留创建该对象的原始文本,因此不会保留评论。没有 CLR 对象存储此类文本。

虽然@Damien 关于为什么 评论没有保存是正确的,但仍然有一些解决方法来存储评论:扩展属性。

例如:

EXEC sys.sp_addextendedproperty @name = N'comments', @value = N'
-- =================================================================================================================================
-- Author:          gotqn
-- Create date:     2015-03-25
-- Description:     Converts a string that has been encoded for transmission in a URL into a decoded string.
-- Usage Example: 
/*
                    SELECT [dbo].[fn_UrlDecode](''http://whosebug.com/search?q=tql+sql+server'');
*/    
-- =================================================================================================================================
', @level0type = 'SCHEMA', @level0name = N'dbo',
   @level1type = 'FUNCTION', @level1name = N'fn_UrlDecode';

您只需要转义嵌入的单引号。

然后您可以通过以下方式检索它们:

SELECT [value]
FROM   sys.fn_listextendedproperty(N'comments', 'SCHEMA', N'N'dbo',
                                 'FUNCTION', N'fn_UrlDecode', NULL, NULL);

补充说明:如果您永远不会解码长度超过 4000 个字符的 URL(而且我很确定您不会 运行 解码许多甚至超过 2048 个字符的 URL),那么您最好将 NVARCHAR(4000) 用于输入和输出数据类型,因为这比 NVARCHAR(MAX).

中的任何一个或两者都快得多

使用死灵法术。

解决方案第一...原因第二...

简单的把CLR函数包在一个标准函数里,把注释放在标准函数里

矫枉过正?也许吧,但正如我所说,我现在的情况是有原因和需要的。

作为一家大型组织的承包商雇员,每个馅饼中都有成吨的手指,而连接在这些手指上的手通常早已不复存在并被遗忘……但他们遗留代码的维护仍在继续。当外部程序集加载到数据库中时,这一点尤其明显,并且需要更改或扩充现有库……某处……但在哪里。编码器不见了,过程的文档被埋在早已被遗忘的地方。

因此,对我来说,注释此类函数的主要原因是为了便于识别程序集的名称和源代码的存储库。除了首先从正确记录的代码开始(记住这是遗留问题)之外,我愿意接受其他关于更好地 places/ways 执行此操作的建议...我洗耳恭听。

在函数或程序集中的某处或与之相关的注释中提供此信息非常有帮助。上面提到的简单包装器是实现此目标的非常 KISS 方法。