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

时间:2015-03-31 14:23:59

标签: sql tsql sql-server-2012 sqlclr

我想在我的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 ...子句之后,但没有任何改变。

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

3 个答案:

答案 0 :(得分:3)

虽然@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个字符的网址(而且我很确定你不会遇到甚至超过2048个字符的网页),那么你会得到更好的服务将NVARCHAR(4000)用于输入和输出数据类型,因为它比NVARCHAR(MAX)中的任何一个或两者都要快得多。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这是预期的行为。即使您在例程签名之前编写本机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

希望它有所帮助!