我知道在数据库中创建过程时我可以为CLR过程定义默认值,如下所示:
CREATE PROCEDURE [dbo].[ShredXml] (
@InputXml [xml],
@AttributeElementHandling [tinyint] = 0,
@ConversionHandling [tinyint] = 0,
@RootElementName [nvarchar](255) = null
)
AS EXTERNAL NAME [ClrXmlShredder].[ClrXmlShredder].[ShredXml]
我无法弄清楚是否有任何方法可以说服Visual Studio在使用其“部署项目”选项时自动执行此操作...
是否有一个可以在参数上设置的属性告诉visual studio,当它在数据库中创建proc时,你想要该参数的默认值是什么?
更新:我已经尝试设置可空性“SqlFacet”,这似乎没有效果(这有道理我猜 - afaik存储的proc参数总是可以为空?)
[Microsoft.SqlServer.Server.SqlProcedure]
public static void ShredXml(SqlXml InputXml,
[SqlFacet(IsNullable = true)]SqlByte AttributeElementHandling,
[SqlFacet(IsNullable = true)]SqlByte ConversionHandling,
[SqlFacet(MaxSize = 255, IsNullable = true)]string RootElementName
)
{
}
答案 0 :(得分:1)
是否有一个可以在参数上设置的属性告诉visual studio,当它在数据库中创建proc时,你想要该参数的默认值是什么?
截至今天,答案是一个响亮的“不”,不幸的是。 SSDT不支持很多选项,例如为标量UDF指定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,但到目前为止的官方词汇是:“好主意,但不会很快发生。”
所以现在最好的办法是创建一个后部署脚本(在SQL Server /用户脚本中找到)并添加
ALTER
语句(如果使用“生成DDL”选项)或CREATE
语句(如果不使用“生成DDL”选项)根据需要重新定义存储过程和/或函数属性。后部署脚本将附加到生成的部署脚本的末尾。
我也在努力解决SSDT发布流程中存在的漏洞,并允许以编程方式设置这些选项。如果我开始工作,我会用详细信息更新这个答案。
答案 1 :(得分:0)
您可以在函数中定义默认值。从底层SQL端包装器传递null时将使用它们。只需声明没有默认值的过程参数,并将默认值设置为该函数。应该没问题。