SQLCLR 具有可选参数/默认值的存储过程
SQLCLR Stored procedures with optional parameters / default values
现在 C# 支持可选参数,有没有办法编写 SQL CLR 存储过程,以便从 Visual Studio 发布将使用可选参数在 SQL 服务器中创建存储过程在 C# 中定义的位置?
过去唯一的方法是手动编写包装函数:
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# 支持它们,所以要么我做错了什么,要么他们根本没有更新发布实现来识别可选参数.
目前无法向 SSDT(SQL 服务器数据工具)发布过程参数的默认值指示。是的,这令人沮丧,因为它确实需要额外的步骤来解析和 "fixing" 生成的 .sql 脚本,或者添加 post-部署执行 ALTER {object}
语句以添加缺失细节的脚本(其中包括其他内容,例如 非常 方便的标量函数的 WITH RETURNS NULL ON NULL INPUT
选项)。
我创建了一个连接建议来解决这个缺陷: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 对象中的默认值。这是另一个挫折,我已经记录了以下连接建议来解决这个缺陷:Support default parameter values for NVARCHAR(MAX), VARBINARY(MAX), and XML types in SQLCLR objects
- 它们将(并且应该)作为 SqlFacet Attribute. The reason that they should not be derived from the C# method param defaults is that parameter defaults do not work the same between C# and T-SQL. Not only is there the LOB type restriction mentioned above, but in T-SQL the position of any parameter having a default is not relevant, and parameters with default values can be followed by required parameters (i.e. no default value specified). Conversely, in C# optional parameters must be at the end of the parameter list and cannot be followed by required parameters. As it states in the MSDN page for Named and Optional Arguments 的附加 属性 处理:
Optional parameters are defined at the end of the parameter list, after any required parameters. If the caller provides an argument for any one of a succession of optional parameters, it must provide arguments for all preceding optional parameters.
- 我目前正在研究一种记录这些默认值的方法,希望
CREATE PROCEDURE
和 CREATE FUNCTION
的其他缺失属性(即 EXECUTE AS
、RETURNS NULL ON NULL INPUT
, 等),但让它在 SSDT 发布过程中尽可能无缝地工作有点棘手,因此没有预计何时完成。完成后,我将通过下载 link. 更新此答案
更新:
最后,手动处理 T-SQL 包装器对象创建可能是最简单的。您可以让 Visual Studio 生成程序集和任何必要的数据库设置语句,然后自己执行 CREATE PROCEDURE
、CREATE FUNCTION
等:
- 在项目属性 -> 项目设置中选中创建脚本(.sql文件)复选框。
- 在 Project Properties -> SQLCLR 中取消选中 Generate DDL 复选框。
- 添加新项目 -> SQL 服务器 -> 用户脚本 -> Post-部署脚本 并添加你的
CREATE
语句这个脚本。
现在 C# 支持可选参数,有没有办法编写 SQL CLR 存储过程,以便从 Visual Studio 发布将使用可选参数在 SQL 服务器中创建存储过程在 C# 中定义的位置?
过去唯一的方法是手动编写包装函数:
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# 支持它们,所以要么我做错了什么,要么他们根本没有更新发布实现来识别可选参数.
目前无法向 SSDT(SQL 服务器数据工具)发布过程参数的默认值指示。是的,这令人沮丧,因为它确实需要额外的步骤来解析和 "fixing" 生成的 .sql 脚本,或者添加 post-部署执行 ALTER {object}
语句以添加缺失细节的脚本(其中包括其他内容,例如 非常 方便的标量函数的 WITH RETURNS NULL ON NULL INPUT
选项)。
我创建了一个连接建议来解决这个缺陷: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 对象中的默认值。这是另一个挫折,我已经记录了以下连接建议来解决这个缺陷:Support default parameter values for NVARCHAR(MAX), VARBINARY(MAX), and XML types in SQLCLR objects - 它们将(并且应该)作为 SqlFacet Attribute. The reason that they should not be derived from the C# method param defaults is that parameter defaults do not work the same between C# and T-SQL. Not only is there the LOB type restriction mentioned above, but in T-SQL the position of any parameter having a default is not relevant, and parameters with default values can be followed by required parameters (i.e. no default value specified). Conversely, in C# optional parameters must be at the end of the parameter list and cannot be followed by required parameters. As it states in the MSDN page for Named and Optional Arguments 的附加 属性 处理:
Optional parameters are defined at the end of the parameter list, after any required parameters. If the caller provides an argument for any one of a succession of optional parameters, it must provide arguments for all preceding optional parameters.
- 我目前正在研究一种记录这些默认值的方法,希望
CREATE PROCEDURE
和CREATE FUNCTION
的其他缺失属性(即EXECUTE AS
、RETURNS NULL ON NULL INPUT
, 等),但让它在 SSDT 发布过程中尽可能无缝地工作有点棘手,因此没有预计何时完成。完成后,我将通过下载 link. 更新此答案
更新:
最后,手动处理 T-SQL 包装器对象创建可能是最简单的。您可以让 Visual Studio 生成程序集和任何必要的数据库设置语句,然后自己执行 CREATE PROCEDURE
、CREATE FUNCTION
等:
- 在项目属性 -> 项目设置中选中创建脚本(.sql文件)复选框。
- 在 Project Properties -> SQLCLR 中取消选中 Generate DDL 复选框。
- 添加新项目 -> SQL 服务器 -> 用户脚本 -> Post-部署脚本 并添加你的
CREATE
语句这个脚本。