Binding empty list or null value to table valued parameter on a stored procedure (.NET)

前端 未结 4 1369
北海茫月
北海茫月 2021-02-01 00:09

I have created a stored procedure that takes a table valued parameter that is a table with a single column of type int. The idea is to simply pass a list of ids in

相关标签:
4条回答
  • 2021-02-01 00:55

    I get the error when passing an empty IEnumerable<int> but it works fine when I pass an empty List<int> instead.

    0 讨论(0)
  • 2021-02-01 00:57

    The trick is: don’t pass in the parameter at all. The default value for a table-valued parameter is an empty table.

    It is a shame that the exception message is so unhelpful.

    0 讨论(0)
  • 2021-02-01 00:59

    I was a bit confused by what the 'not passing the parameter' statement means. What ends up working for Entity Framework ExecuteSqlCommandAsync() is this:

      new SqlParameter("yourParameterName", SqlDbType.Structured)
      {
          Direction = ParameterDirection.Input,
          TypeName = "yourUdtType",
          Value = null
      };
    

    This will pass the parameter as 'default'.

    0 讨论(0)
  • 2021-02-01 00:59

    Not passing a value does work but not in the case where I had multiple table value parameters to pass into the procedure. How I solved it was to specify a value of DEFAULT in my query string. For example,

    string sqlQuery = "[dbo].[GetOrderData] @QueueId";
    
    if (OrderIdList.Any())
    {
        sqlQuery = sqlQuery + ", @OrderIdList";
    }
    else
    {
        sqlQuery = sqlQuery + ", DEFAULT";
    }
    
    if (RegionIdList.Any())
    {
        sqlQuery = sqlQuery + ", @RegionIdList";
    }
    else
    {
        sqlQuery = sqlQuery + ", DEFAULT";
    }
    

    Kudos to http://www.sommarskog.se/arrays-in-sql-2008.html#Invoking where I found the solution for this.

    0 讨论(0)
提交回复
热议问题