既然C#支持可选参数,是否有办法编写SQL CLR存储过程,以便从Visual Studio发布将使用C#中定义的可选参数在SQL Server中创建存储过程?
过去唯一的方法是手动编写包装函数:
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#支持它们,所以要么我做错了,要么他们只是没有更新发布实现来识别可选参数。
答案 0 :(得分:5)
目前无法向SSDT(SQL Server数据工具)发布流程指示参数的默认值。是的,这很令人沮丧,因为它确实需要额外的一步来解析和修复&#34;生成的 .sql 脚本,或添加执行ALTER {object}
语句的部署后脚本以添加缺少的详细信息(其中包括标量的WITH RETURNS NULL ON NULL INPUT
选项等其他内容非常方便的功能。
我已经创建了一个Connect Suggestion来解决这个问题:SSDT - Support T-SQL parameter defaults for SQLCLR objects via the SqlFacet attribute when generating the publish and create SQL scripts
有关指定参数默认值的可能性的两个注意事项:
NVARCHAR(MAX)
,VARBINARY(MAX)
和XML
- 因为这些数据类型不支持SQLCLR中的默认值对象。这是另一个挫折,我已经记录了以下Connect Suggestion来解决这个缺陷:Support default parameter values for NVARCHAR(MAX), VARBINARY(MAX), and XML types in SQLCLR objects 可选参数在任何必需参数之后在参数列表的末尾定义。如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。
CREATE PROCEDURE
和CREATE FUNCTION
的其他缺失属性(即EXECUTE AS
,RETURNS NULL ON NULL INPUT
,等),但是在SSDT发布过程中尽可能无缝地工作是有点棘手的,所以没有ETA何时完成。完成后,我将通过下载链接更新此答案。 <强>更新强>
最后,手动处理T-SQL包装器对象可能最容易。您可以让Visual Studio生成程序集和任何必要的数据库设置语句,然后自己执行CREATE PROCEDURE
,CREATE FUNCTION
等操作:
CREATE
语句。