【发布时间】:2018-05-18 21:19:30
【问题描述】:
我已经创建了基于 SQLCLR 的用户定义表值函数以及用户定义类型。
我现在想要的是一个返回表的 SQLCLR UDT 上的方法,类似于 XML 数据类型上的 nodes 方法。
SqlMethod 属性/装饰的TableDefinition 和FillRowMethodName 属性似乎暗示它应该是可能的,但实际上没有任何效果。当我调用这样的方法时(我预计会失败):
SELECT @Instance.AsTable();
我明白了:
无效的数据类型
如果我以这种方式调用 SQLCLR 表值函数,这与我得到的错误不同。
当我这样打电话时:
SELECT * FROM @Instance.AsTable();
我收到(可能是预期的)错误:
表值方法返回的表(及其列)需要别名。
当我这样打电话时:
SELECT * FROM @Instance.AsTable() t(c1,c2);
上面写着:
表值函数“AsTable”不能有列别名
我感觉这个问题可能与表函数应该是静态的这一事实有关,所以我也尝试将它实现为扩展方法,但在这种情况下它甚至无法编译。我明白了:
扩展方法必须定义在非泛型静态类中
显然我可以将它实现为一个普通的 SQLCLR 表函数,它需要一个我的 UDT 类型的参数。事实上,我实际上已经做到了这一点并且SELECT * FROM dbo.AsTable(@Instance); 有效,但我不喜欢那个解决方案。我真的很想让这个语法起作用:SELECT * FROM @Instance.AsTable() t(c1,c2);
这是一个非工作版本:
[SqlMethod(IsDeterministic = false, DataAccess = DataAccessKind.None, OnNullCall=true
, TableDefinition = "RowKey nvarchar(32),RowValue nvarchar(1000)"
, FillRowMethodName = "FormatLanguageRow")]
public IEnumerable AllRows()
{
return _rowCollection;
}
【问题讨论】:
标签: sql-server extension-methods user-defined-functions sqlclr user-defined-types