我想在我的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 ...
子句之后,但没有任何改变。
有没有办法解决这种问题?
答案 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
希望它有所帮助!