如何指定对 SQLCLR table 值函数进行排序?

How to specify that a SQLCLR table valued function is ordered?

我有一个 sqlclr table 值函数,其原型类似于

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]

实际功能无关紧要。现在我知道我的函数总是 returns 结果基于 order_id.

的顺序

我正在使用这个函数并将它加入到 table 中,该 table 在 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]

此版本的函数不需要排序,tempdb 中也不会发生溢出。 然而,我们定期通过 SSDT 部署我们的 sql 项目,并且每次我们这样做都会自动生成原型。我无法控制设置的内容。我的 cs 函数中是否有一个选项,以便我可以指定 some_func 的结果是有序的?

很遗憾,SSDT 没有支持此选项(也没有其他几个)的机制(即 SqlFacet 等属性)。您的选择是:

  1. 创建一个 post-部署 SQL 脚本来发出一个 ALTER FUNCTION 语句,这正是您想要的。只需将 SQL 脚本添加到您的项目,并将其 "Build Action" 设置为 "PostDeploy"。

  2. 自己生成 DDL(即 CREATE FUNCTION...)并使用 "Post-build event"(在 Project Properties | Build Events 下)通过 [=58] 执行 SQL =]CMD

  3. 创建您自己的可以用来标记函数的属性,然后创建部署贡献者 ("Build Action" = "Deployment Extension Configuration")。这将允许它通过 SSDT 内联处理,但似乎需要相当多的工作。

SSDT 不支持的其他选项(请通过以下链接投票支持它们:-):

由于所有这些不受支持的选项,我很少将 SSDT 用于实际部署,当我这样做时,我使用 Post 部署 SQL 脚本来执行 ALTER 语句(虽然它们不是动态的,这就是为什么最好通过代码中的属性来支持)。大多数时候,我只是使用自己的部署脚本 ( .CMD ) 作为 Post 构建事件触发。


P.S。我现在已经针对此特定功能提交了 Microsoft 连接建议:
SSDT - Support ORDER clause for SQLCLR TVFs via the SqlFunction attribute when generating the publish and create SQL scripts