无法访问存储过程中的表变量

ank*_*kur 7 c# stored-procedures sql-server-2008

我以这种方式将数据表从Code传递给存储过程.

DataTable table = CommonFunctions.ToDataTable(request);
object[] spParams = new object[1];
spParams[0] = table;

DbCommand dbCommand = 
  db.GetStoredProcCommand("OS_UpdateOrgStructureDetails", spParams);
Run Code Online (Sandbox Code Playgroud)

我试图在存储过程中访问此参数.

CratePROCEDURE OS_UpdateOrgUnits  
 @table OS_RenameNodeTable READONLY  
AS  
BEGIN  
    UPDATE OrgUnit  
    SET DetailName = ut.NewValue  
    FROM @table ut  
    INNER JOIN OrgUnit ou ON ou.OrgUnitID = ut.OrgUnitID  
END 
Run Code Online (Sandbox Code Playgroud)

但是当调用存储过程时,它会抛出错误.

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol 
stream is incorrect. Table-valued parameter 1 ("@table"), row 0, column 0: 
Data type 0xF3 (user-defined table type) has a non-zero length database name 
specified.  Database name is not allowed with a table-valued parameter, only 
schema name and type name are valid.
Run Code Online (Sandbox Code Playgroud)

无法解决错误.

小智 15

由于SqlCommandBuilder.DeriveParameters方法中的错误,表值参数的SqlParameter对象的TypeName属性包含数据库名称(请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient .sqlcommandbuilder.deriveparameters.aspx,注释"表值参数未正确输入").

修复此问题,您可以在创建命令后立即添加此通用代码:

foreach (SqlParameter parameter in dbCommand.Parameters)
{
    if (parameter.SqlDbType != SqlDbType.Structured)
    {
        continue;
    }
    string name = parameter.TypeName;
    int index = name.IndexOf(".");
    if (index == -1)
    {
        continue;
    }
    name = name.Substring(index + 1);
    if (name.Contains("."))
    {
        parameter.TypeName = name;
    }
}
Run Code Online (Sandbox Code Playgroud)