既然C#支持可选参数,是否有办法编写SQL CLR存储过程,以便Visual Studio中的发布将使用可选参数在SQL Server中创建存储过程,在C#中定义?SQLCLR具有可选参数/默认值的存储过程
做到这一点,在过去的唯一办法是通过手工编写包装函数:
Default parameter values/optional parameters for .NET stored procedures in SQL Server 2005
我宁愿避免这种情况,因为它需要编写两次接口,以及维持两个接口情况发生变化。
实施例:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void help(string FunctionName = "")
{
SqlPipe pipe = SqlContext.Pipe;
pipe.Send("help> " + FunctionName + "<");
}
从VS2013收率出版(在生成的发布脚本):
CREATE PROCEDURE [dbo].[help] @FunctionName [nvarchar](MAX)
AS EXTERNAL NAME [YOURDB].[StoredProcedures].[help];
运行它:
exec help
Procedure or function 'help' expects parameter '@FunctionName', which was not supplied.
但是,如果手动编写的程序创造如此:
drop procedure [help]
CREATE PROCEDURE [dbo].[help]
(@FunctionName nvarchar(100) = null)
AS EXTERNAL NAME [YOURDB].[StoredProcedures].[help];
exec help
help> <
....它现在按预期运行。
Visual Studio将所有需要的参数发布为可选参数,因为C#支持它们,所以无论我做错了什么,或者他们只是没有更新发布实现来识别可选参数。
像往常一样彻底的答案,谢谢。由于这种情况以及其他各种疯狂,我不知道该如何解决,所以我将SQLCLR代码放在一个完全独立的VS项目中,并完全手动部署(手写的函数定义) - 这是一种痛苦,但是,你可以做。如果这些缺点在官方文档中有说明,那将是很好的,所以一个人从一开始就知道它不会像预期的那样工作(并且*不可能*变通)。 – tbone
@tbone是的,这实际上是我为生产级别的东西做的。我只依靠Visual Studio部署进行测试。我添加了关于它的答案的更新。有点烦人写我自己,但签名很少改变,所以它不是真的那么糟糕。 –