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
I get the error when passing an empty IEnumerable<int>
but it works fine when I pass an empty List<int>
instead.
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.
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'.
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.