This page from SQL Server 2008 BOL,谈到CLR存储过程,并有一个标题为“表值参数”的部分,它们说明了它们如何有利.这很棒 – 我很乐意在我的CLR过程中使用TVP,但不幸的是,这似乎是宇宙中这种可能性的唯一参考,该部分没有描述什么是语法(也不是进一步的信息在本段末)
当然,我可以很容易地找到关于如何使用T-sql过程的TVP的描述,或者一般来说,如何执行CLR处理.但是写一个采用TVP的CLR proc?没有.这是非常不成功的,因为将多行数据传递给存储过程是一个受欢迎的问题.
这让我想知道该页面上的部分是否存在错误.有人请告诉我不是,并指出我更多的信息/例子.
[编辑]
当我遇到this,which seems to be the final nail in the coffin时,我即将发布到MS论坛之一.看起来不可能完成.
解决方法
我可以找到一个
lot
more
references.但是,这些都是将表值参数传递给Tsql过程,所以这几乎没有用.
但是,我得出结论,这是不可能的.首先,CLR和sql类型之间有list of mappings.对于表类型,没有映射,所以以下不起作用,例如:
[sqlProcedure] public static void StoredProcedure(DataTable tvp,out int sum) { return 42; }@H_502_17@接着
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@H_502_17@无论您尝试什么类型(DataTable,DbDataReader,IEnumerable),CREATE PROCEDURE调用都会生成错误6552:“ClrTest”的CREATE PROCEDURE失败,因为参数“@tvp”的T-sql和CLR类型不匹配.
其次,您链接的页面上的文档说:用户定义的表类型不能作为表值参数传递给或从sql Server进程中执行的托管存储过程或函数返回.
我似乎无法在任何地方找到如何在C#中创建用户定义的表类型,但这似乎也是一个死胡同.
也许你可以在Microsoft论坛上的某个地方问你的问题.他们在CLR sproc页面上提到表值参数仍然很奇怪,但是从来没有解释如何实现这一点.如果你找到任何解决方案,我想知道.