Sql server 如何指定SQLCLR表值函数的顺序?
我有一个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] 实际的功能并不重要
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
)。你的选择是:
alterfunction
语句,该语句正是您想要的。只需向项目中添加一个SQL脚本,并将其“构建操作”设置为“后期部署”CREATE FUNCTION…
),并使用“生成后事件”(在项目属性|生成事件下)通过SQLCMD执行SQLALTER
语句(尽管它们不是动态的,这就是为什么最好通过代码中的属性来支持它们)。大多数时候,我只是使用自己的部署脚本(.CMD),作为构建后事件触发
另外,我现在已经提交了一份针对此特定功能的Microsoft连接建议:
有点遗憾,但我可以使用alter函数步骤。