我可以找到更多 参考资料。但是,这些都是为了将表值参数传递给 TSQL 过程,所以用处不大。
但是,我得出的结论是,这是不可能的。首先,有CLR 和 SQL 类型之间的映射列表。对于表类型,没有映射,因此以下内容不起作用,例如:
[SqlProcedure]
public static void StoredProcedure(DataTable tvp, out int sum)
{
return 42;
}
进而
CREATE TYPE MyTableType AS TABLE
(
Id INT NOT NULL PRIMARY KEY,
[Count] INT NOT NULL
)
GO
CREATE ASSEMBLY ClrTest FROM '<somePath>'
GO
CREATE PROCEDURE ClrTest
AS EXTERNAL NAME ClrTest.StoredProcedures.StoredProcedure
GO
无论您尝试何种类型 ( DataTable
, DbDataReader
, IEnumerable
),CREATE PROCEDURE
调用都会不断生成错误 6552: CREATE PROCEDURE for "ClrTest" 失败,因为参数 "@tvp" 的 T-SQL 和 CLR 类型不匹配。
其次,您链接到的页面上的文档说:用户定义的表类型不能作为表值参数传递给在 SQL Server 进程中执行的托管存储过程或函数,也不能从其返回。
我似乎无法在任何地方找到如何在 C# 中创建用户定义的表类型,但这似乎也是一个死胡同。
也许您可以在 Microsoft 论坛的某个地方提出您的问题。他们在 CLR sproc 页面上提到表值参数但从未解释如何实现这一点仍然很奇怪。如果您找到任何解决方案,我想知道。