我有一个sqlclr表值函数,它有一个像
这样的原型CREATE FUNCTION [dbo].[some_func]
(...)
RETURNS TABLE (
[order_id] INT NULL,
[value1] VARCHAR(50) NULL,
[value2] INT NULL
)
AS EXTERNAL NAME [some_db].[MyProject].[some_func]
实际功能并不重要。现在我知道我的函数总是根据order_id
按顺序返回结果。
我正在使用此功能并将其加入到order_id
上编入索引的表中,当我加入这两个并查看该计划时,我发现该联接已导致溢出进行排序
现在,我发现这篇文章告诉我,我可以使用修改原型并指定顺序。
http://www.sqlskills.com/blogs/bobb/sql-server-2008-ordered-sqlclr-table-valued-functions/
手动更改原型会产生所需的结果
CREATE FUNCTION [dbo].[some_func]
(...)
RETURNS TABLE (
[order_id] INT NULL,
[value1] VARCHAR(50) NULL,
[value2] INT NULL
)
ORDER(order_id asc)
AS EXTERNAL NAME [some_db].[MyProject].[some_func]
这个版本的func不需要排序,并且tempdb中没有发生溢出。
但是,我们通过SSDT定期部署我们的sql项目,每次我们这样做都会自动生成原型。我无法控制设置的内容。我的cs函数中是否有一个选项,以便我可以指定some_func
的结果是否已订购?
答案 0 :(得分:3)
不幸的是,SSDT没有用于支持此选项的机制(即SqlFacet
等属性)(也没有其他几个)。您的选择是:
创建一个部署后的SQL脚本,以发出一个与您希望的完全相同的ALTER FUNCTION
语句。只需在项目中添加一个SQL脚本,并将其“Build Action”设置为“PostDeploy”。
自己生成DDL(即CREATE FUNCTION...
)并使用“构建后事件”(在“项目属性”|“构建事件”下)通过SQLCMD执行SQL
创建您自己的属性,您可以使用该标记该功能,然后创建部署参与者(“Build Action”=“部署扩展配置”)。这将允许它通过SSDT进行内联处理,但似乎是相当有用的工作。
SSDT不支持其他选项(请通过以下链接投票支持: - ):
由于所有这些不受支持的选项,我很少使用SSDT进行实际部署,而当我这样做时,我使用Post Deployment SQL脚本来执行ALTER
语句(尽管它们不是动态的,这就是为什么最好通过代码中的属性来支持)。大多数时候我只使用自己的部署脚本( .CMD )作为Post Build事件触发。
P.S。我现在已经为此特定功能提交了Microsoft连接建议:
SSDT - Support ORDER clause for SQLCLR TVFs via the SqlFunction attribute when generating the publish and create SQL scripts