我想向我的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://stackoverflow.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 ...
子句之后,但没有任何更改。
有办法纠正这种行为吗?
虽然@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://stackoverflow.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)
要快得多。
基本上,如果它是一个没有被列为在sys.sql_modules
中存储数据的类型,那么创建对象的原始文本将不会被保留,因此注释也不会被保留。没有CLR对象存储此类文本。
这是预期的行为。即使您编写了一个在例程签名之前添加注释的本地TSQL脚本,也要根据DBMS构建它,并右键单击/编辑以查看注释不会出现的代码。继续尝试这种方法:
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
希望它能有所帮助!
进行亡灵巫师。
解决方案优先。。。原因二。。。
只需将CLR函数封装在标准函数中,然后将注释放入标准函数中。
过度杀戮?也许吧,但正如我所说,在我目前的处境下,我有理由也有需要。
作为一个大型组织承包商的员工,每个馅饼里都有很多手指,而那些手指上的手通常早已不见了,被遗忘了。。。但其遗留代码的维护仍然存在。当外部程序集加载到数据库中时,这一点尤其明显,并且需要更改或扩充现有库。。。在某处但是在哪里。编码器不见了,过程的文档被埋葬在一个早已被遗忘的地方。
因此,对我来说,注释这些函数的主要原因是为了便于识别程序集的名称和源代码的存储库。除了从一开始就使用正确文档化的代码(记住这是遗留问题)之外,我对其他关于更好的地方/方法的建议持开放态度。。。我洗耳恭听。
在函数或程序集中的某个位置或与之相关的注释中提供这些信息非常有用。上面提到的简单包装器是实现这一目标的一种非常KISS的方法。