Sql server 如何指定SQLCLR表值函数的顺序?

Sql server 如何指定SQLCLR表值函数的顺序?,sql-server,sqlclr,Sql Server,Sqlclr,我有一个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] 实际的功能并不重要

我有一个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\u id
按顺序返回结果

我正在使用这个函数,并将它与一个在
order\u id
上索引的表连接起来。当我将这两个函数连接起来并查看计划时,我发现连接导致了排序溢出

现在,我找到了这篇文章,它告诉我可以使用修改原型并指定顺序

手动更改原型确实会产生所需的结果

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函数中是否有一个选项,以便我可以指定某个函数的结果是有序的?

不幸的是,SSDT没有支持此选项(或其他几个)的机制(即属性,如
SqlFacet
)。你的选择是:

  • 创建一个部署后SQL脚本,以发出一个
    alterfunction
    语句,该语句正是您想要的。只需向项目中添加一个SQL脚本,并将其“构建操作”设置为“后期部署”

  • 自己生成DDL(即,
    CREATE FUNCTION…
    ),并使用“生成后事件”(在项目属性|生成事件下)通过SQLCMD执行SQL

  • 创建您自己的属性,您可以使用该属性标记函数,然后创建部署参与者(“构建操作”=“部署扩展配置”)。这将允许它通过SSDT进行内联处理,但这似乎是一项相当多的工作

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

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


    另外,我现在已经提交了一份针对此特定功能的Microsoft连接建议:

    有点遗憾,但我可以使用alter函数步骤。