我在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()方法。