如何指定SQLCLR表值函数是否有序?

时间:2017-02-23 18:14:28

标签: 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]

实际功能并不重要。现在我知道我的函数总是根据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的结果是否已订购?

1 个答案:

答案 0 :(得分:3)

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

  1. 创建一个部署后的SQL脚本,以发出一个与您希望的完全相同的ALTER FUNCTION语句。只需在项目中添加一个SQL脚本,并将其“Build Action”设置为“PostDeploy”。

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

  3. 创建您自己的属性,您可以使用该标记该功能,然后创建部署参与者(“Build Action”=“部署扩展配置”)。这将允许它通过SSDT进行内联处理,但似乎是相当有用的工作。

  4. 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