关于此错误有很多问题,但似乎没有相关。
我们得到的原始异常
Der eingehende表格数据流(TDS)fürdasRPC-Protokoll(远程程序调用)ist nicht richtig。 0-Tabellenwertparameter(“”),Zeile 0,Spalte 0:Der 0xE7-Datentyp hateineungültigeDaten-oderMetadatenlänge。
我试图翻译它
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确
0-TableValuedParameter(“”),第0行,第0列:0xE7-Datatype的数据或元数据长度无效。
SqlServer的版本
Microsoft SQL Server 2016(SP1)(KB3182545) - 13.0.4001.0(X64) 2016年10月28日18:17:30 版权所有(c)Microsoft Corporation Windows Server 2016 Standard 6.3(Build 14393:)(Hypervisor)上的标准版(64位)
造成这种情况的原因是什么:
我们使用用户定义的类型来传递表值参数。该错误是可重现的,通过DataTable传递一个包含String.Empty
的行和列作为以下类型的参数:
CREATE TYPE dbo.para_table_varchar AS TABLE (value nvarchar(10) COLLATE Latin1_General_ci_ai NOT NULL);
C#代码(.net 4.6.1)
DataTable table = new DataTable();
DataColumn column = table.Columns.Add("value", typeof(string));
column.MaxLength = 0;
table.Rows.Add(string.Empty);
SqlParameter para = _cmd.Parameters.Add("@ptable", SqlDbType.Structured, 0);
para.Value = table;
para.TypeName ="dbo.para_table_varchar";
Command看起来像这样
SELECT * FROM someTable WHERE someColumn IN (SELECT value FROM @ptable)
这只发生在提到的SQLServer 2016上。大约20个其他客户端没有此问题。
虽然Microsoft解决了这个问题here,但建议的workarround(将Size设置为-1)似乎不起作用。