SQLCLR具有可选参数/默认值的存储过程

本文关键字:默认值 存储过程 参数 SQLCLR | 更新日期: 2023-09-27 17:51:03

既然c#支持可选参数,是否有一种方法可以编写SQL CLR存储过程,以便从Visual Studio发布将使用c#中定义的可选参数在SQL server中创建存储过程?

过去唯一的方法是手动编写包装器函数:
SQL Server 2005中。net存储过程的默认参数值/可选参数

我宁愿避免这种情况,因为它需要编写两次接口,以及在事情发生变化时维护两个接口。

的例子:

[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具有可选参数/默认值的存储过程

目前不可能向SSDT (SQL Server数据工具)发布进程的参数默认值指示。是的,这是令人沮丧的,因为它确实需要解析和"修复"生成的的额外步骤。sql脚本,或者添加一个部署后脚本,该脚本执行ALTER {object}语句以添加缺失的细节(其中包括其他东西,例如用于标量函数的WITH RETURNS NULL ON NULL INPUT选项非常方便)。

我已经创建了一个连接建议来解决这个缺陷:SSDT -在生成发布和创建SQL脚本时,通过SqlFacet属性支持SQLCLR对象的T-SQL参数默认值

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

  • 它们不适用于LOB类型(NVARCHAR(MAX), VARBINARY(MAX)XML)的T-SQL参数,因为这些数据类型不支持SQLCLR对象中的默认值。这是另一个挫折,我已经记录了以下连接建议来解决这个缺陷:支持SQLCLR对象中NVARCHAR(MAX), VARBINARY(MAX)和XML类型的默认参数值
  • 它们将(也应该)作为SqlFacet属性的附加属性来处理。它们不应该从c#方法参数默认值派生的原因是,参数默认值在c#和T-SQL之间的工作方式不同。不仅存在上面提到的LOB类型限制,而且在T-SQL中,具有默认值的任何参数的位置都是无关的,具有默认值的参数可以后跟所需的参数(即不指定默认值)。相反,在c#中,可选参数必须位于参数列表的末尾,不能跟在必选参数后面。正如MSDN页面中命名参数和可选参数所述:

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

  • 我目前正在研究一种方法来记录这些默认值,也希望CREATE PROCEDURECREATE FUNCTION(即EXECUTE AS, RETURNS NULL ON NULL INPUT等)的其他缺失属性,但是让它在SSDT发布过程中尽可能无缝地工作有点棘手,所以何时完成没有ETA。一旦完成,我会用下载链接更新这个答案。

更新:
最后,手动处理T-SQL包装器对象创建可能是最简单的方法。您可以让Visual Studio生成程序集和任何必要的DB设置语句,但然后自己执行CREATE PROCEDURE, CREATE FUNCTION等操作:

  1. 项目属性->项目设置中检查Create script(。复选框
  2. Project Properties -> SQLCLR中取消选中Generate DDL复选框。
  3. Add New Item -> SQL Server -> User Scripts -> Post-Deployment Script并在此脚本中添加CREATE语句。