如何指定对 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
等属性)。您的选择是:
创建一个 post-部署 SQL 脚本来发出一个 ALTER FUNCTION
语句,这正是您想要的。只需将 SQL 脚本添加到您的项目,并将其 "Build Action" 设置为 "PostDeploy"。
自己生成 DDL(即 CREATE FUNCTION...
)并使用 "Post-build event"(在 Project Properties | Build Events 下)通过 [=58] 执行 SQL =]CMD
创建您自己的可以用来标记函数的属性,然后创建部署贡献者 ("Build Action" = "Deployment Extension Configuration")。这将允许它通过 SSDT 内联处理,但似乎需要相当多的工作。
SSDT 不支持的其他选项(请通过以下链接投票支持它们:-):
- Implement OnNullCall property in SqlFunctionAttribute for RETURNS NULL ON NULL INPUT
- SSDT - Support T-SQL parameter defaults for SQLCLR objects via the SqlFacet attribute when generating the publish and create SQL scripts
由于所有这些不受支持的选项,我很少将 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
我有一个 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
等属性)。您的选择是:
创建一个 post-部署 SQL 脚本来发出一个
ALTER FUNCTION
语句,这正是您想要的。只需将 SQL 脚本添加到您的项目,并将其 "Build Action" 设置为 "PostDeploy"。自己生成 DDL(即
CREATE FUNCTION...
)并使用 "Post-build event"(在 Project Properties | Build Events 下)通过 [=58] 执行 SQL =]CMD创建您自己的可以用来标记函数的属性,然后创建部署贡献者 ("Build Action" = "Deployment Extension Configuration")。这将允许它通过 SSDT 内联处理,但似乎需要相当多的工作。
SSDT 不支持的其他选项(请通过以下链接投票支持它们:-):
- Implement OnNullCall property in SqlFunctionAttribute for RETURNS NULL ON NULL INPUT
- SSDT - Support T-SQL parameter defaults for SQLCLR objects via the SqlFacet attribute when generating the publish and create SQL scripts
由于所有这些不受支持的选项,我很少将 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