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

时间:2017-11-17 09:21:56

标签: c# sql-server sql-server-2016 table-valued-parameters

关于此错误有很多问题,但似乎没有相关。

我们得到的原始异常

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

0 个答案:

没有答案