传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确

问题描述 投票:0回答:2

关于这个错误有很多问题,但似乎没有一个是相关的。

我们得到的原始异常

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)似乎不起作用。

c# sql-server sql-server-2016 table-valued-parameters
2个回答
0
投票

将变量类型从 not null 更改为 null 然后我认为你不会得到这个错误


0
投票

我在将 SqlBinary 传递到 BINARY( 32) TVP 列,我没有为该列设置 MaxLength。

© www.soinside.com 2019 - 2024. All rights reserved.