SQL Server CLR UDF超时

时间:2017-02-08 13:49:38

标签: sql-server sqlclr

我在SQL Server 2008 R2中进行了以下设置:在表值用户定义的函数上使用交叉应用的视图,该函数调用CLR方法。此CLR方法将给定的BLOB转换为包含双精度的表。

有时一些查询在大约10秒后使用视图超时。对于任何查询,超时都不会一致地发生,并且当某些查询失败时,其他查询也可以正常工作。这些查询具有相同的结构,但查询不同的数据。

发生问题时,SQL Server日志中未记录任何错误。我怀疑超时与CLR的使用有关,但没有观察到实际验证这一点。

任何有关进一步故障排除的建议都将受到高度赞赏。非常感谢提前。

修改

这是C#代码:

private class Row
{
    public SqlDateTime TimeStep { get; set; }
    public SqlDouble Amount { get; set; }
}

public static void TableUDF_FillRow(object tableTypeObject, out SqlDateTime timeStep, out SqlDouble amount)
{
    Row tableType = (Row)tableTypeObject;
    timeStep = tableType.TimeStep;
    amount = tableType.Amount;
}

[SqlFunction(DataAccess = DataAccessKind.Read,
             TableDefinition = "timeStep DATETIME, amount FLOAT",
             FillRowMethodName = "TableUDF_FillRow")]
public static IEnumerable VarBinaryToFloatTable(byte[] blob, DateTime simulationStartDate)
{
    double[] result = new double[blob.Length / sizeof(double)];
    Buffer.BlockCopy(blob, 0, result, 0, blob.Length);

    var list = new List<Row>(result.Length);
    foreach (double d in result)
    {
        Row row = new Row
        {
            TimeStep = simulationStartDate, 
            Amount = d
        };
        list.Add(row);
        simulationStartDate = simulationStartDate.AddHours(1); // assumes one hour time steps
    }

    return list;
}

表值UDF只调用VarBinaryToFloatTable()方法。

0 个答案:

没有答案