我编写了许多 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