小编Kev*_*Kev的帖子

如何允许 SQL CLR 函数在并行查询计划中运行并具有数据访问权限

我编写了许多 SQL CLR 函数 (UDF),它们从托管在 IBM iSeries 上的外部 DB2 数据库(使用 IBM DB2 .Net Provider)读取数据。为了使函数具有读取此数据的必要权限,我需要使用 SqlFunction 属性装饰该函数,并将 DataAccess 属性设置为 DataAccessKind.Read。我还将程序集部署为 UNSAFE。

从 DB2 数据库读取数据所花费的时间相对较慢(例如,最简单的 ExecuteScalar 需要 3 毫秒)。

我使用这些 UDF 有效地将 DB2 数据库中的数据合并到 Sql Server 视图中。

例如,假设我的 UDF 定义为

[SqlFunction(DataAccess = DataAccessKind.Read, IsDeterministic = true)] 
public static SqlMoney GetCostPrice(SqlString partNumber)
{
    decimal costPrice;
    // open DB2 connection and retrieve cost price for part
    return new SqlMoney(costPrice);
}
Run Code Online (Sandbox Code Playgroud)

然后在我的 SQL 视图中使用它作为:

select Parts.PartNumber,
       dbo.GetCostPrice(Parts.PartNumber) as CostPrice
from Parts
Run Code Online (Sandbox Code Playgroud)

如果我可以使用并行查询计划运行我的 SQL 视图,那么糟糕的性能问题可能会受到显着影响。

有关于如何强制查询计划并行而不是串行运行的文档技术,但这些技术受到 …

.net sql-server sqlclr code-access-security elevated-privileges

5
推荐指数
1
解决办法
1143
查看次数