Bài viết này đã nhiều năm tuổi nhưng tôi gặp phải vấn đề tương tự và có một giải pháp. Nếu bạn không sử dụng DataTable mà điền vào một tập hợp SqlDataRecord thì bạn có thể đặt kiểu dữ liệu của SqlDataRecord thành SqlDbType.Variant.
List<SqlDataRecord> dataTable = new List<SqlDataRecord>();
var dr = new SqlDataRecord(
new SqlMetaData("Id", SqlDbType.Int),
new SqlMetaData("Value", SqlDbType.Variant));
dr.SetInt32(0, id);
dr.SetValue(1, myObject);
dataTable.Add(dr);
[...]
SqlCommand sqlCommand = new SqlCommand("dbo.MyProc");
var structuredParam = sqlCommand.Parameters.Add("myTableParam", SqlDbType.Structured);
structuredParam.Value = dataTable;