【问题标题】:How to specify that a SQLCLR table valued function is ordered?如何指定 SQLCLR 表值函数是有序的?
【发布时间】:2017-07-14 09:02:02
【问题描述】:

我有一个 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 的结果是有序的?

【问题讨论】:

    标签: sql-server sqlclr


    【解决方案1】:

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

    1. 创建一个部署后的 SQL 脚本来发出一个 ALTER FUNCTION 语句,这正是您想要的。只需将 SQL 脚本添加到您的项目,并将其“构建操作”设置为“PostDeploy”。

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

    3. 创建你自己的属性,你可以用它来标记函数,然后创建一个部署贡献者(“构建操作”=“部署扩展配置”)。这将允许它通过 SSDT 内联处理,但似乎是相当多的工作。

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

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


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

    【讨论】:

    • 有点难过,但我可以使用 alter function step。
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2012-09-14
    • 2019-10-07
    • 1970-01-01
    • 2012-11-27
    • 2019-11-16
    相关资源
    最近更新 更多