SQLCLR存储过程包含可选参数/默认值

时间:2015-05-27 22:54:47

标签: c# sql-server sqlclr

既然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#支持它们,所以要么我做错了,要么他们只是没有更新发布实现来识别可选参数。

1 个答案:

答案 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

有关指定参数默认值的可能性的两个注意事项:

  • 它们不适用于LOB类型的T-SQL参数 - NVARCHAR(MAX)VARBINARY(MAX)XML - 因为这些数据类型不支持SQLCLR中的默认值对象。这是另一个挫折,我已经记录了以下Connect Suggestion来解决这个缺陷:Support default parameter values for NVARCHAR(MAX), VARBINARY(MAX), and XML types in SQLCLR objects
  • 他们将(并且应该)作为SqlFacet属性的附加属性进行处理。它们从C#方法param默认值派生的原因是参数默认值在C#和T-SQL之间不起作用。不仅存在上述LOB类型限制,而且在T-SQL中,具有默认值的任何参数的位置都不相关,并且具有默认值的参数可以跟随所需参数(即,没有指定默认值)。相反,在C#中,可选参数必须位于参数列表的末尾,并且不能跟随所需的参数。正如它在Named and Optional Arguments的MSDN页面中所述:
      

    可选参数在任何必需参数之后在参数列表的末尾定义。如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。

  • 我目前正在研究注意这些默认值的方法,希望CREATE PROCEDURECREATE FUNCTION的其他缺失属性(即EXECUTE ASRETURNS NULL ON NULL INPUT,等),但是在SSDT发布过程中尽可能无缝地工作是有点棘手的,所以没有ETA何时完成。完成后,我将通过下载链接更新此答案。

<强>更新
最后,手动处理T-SQL包装器对象可能最容易。您可以让Visual Studio生成程序集和任何必要的数据库设置语句,然后自己执行CREATE PROCEDURECREATE FUNCTION等操作:

  1. 项目属性中 - &gt;项目设置选中创建脚本(.sql文件)复选框。
  2. 项目属性中 - &gt; SQLCLR 取消选中生成DDL 复选框。
  3. 添加新项目 - &gt; SQL Server - &gt;用户脚本 - &gt;部署后脚本并在此脚本中添加CREATE语句。