关于这个错误有很多问题,但似乎没有一个是相关的。
我们得到的原始异常
Der eingehende Tabular Data Stream (TDS) für das RPC-Protokoll(远程过程调用)ist nicht richtig。
0-Tabellenwertparameter (""), Zeile 0, Spalte 0: Der 0xE7-Datentyp hat eine ungültige Daten-oder Metadatenlä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) 微软公司 Windows Server 2016 Standard 6.3(内部版本 14393:)(管理程序)上的标准版(64 位)
这是什么原因:
我们使用用户定义的类型来传递表值参数。该错误是可重现的,通过一个包含
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";
命令看起来像这样
SELECT * FROM someTable WHERE someColumn IN (SELECT value FROM @ptable)
这只发生在提到的 SQLServer 2016 上。大约 20 个其他客户端没有这个问题。
虽然微软在 here 中解决了这个问题,但建议的解决方法(将大小设置为 -1)似乎不起作用。
将变量类型从 not null 更改为 null 然后我认为你不会得到这个错误
我在将 SqlBinary 传递到 BINARY( 32) TVP 列,我没有为该列设置 MaxLength。