Acho que atualmente estou enfrentando um bug no Entity Framework 6 e possivelmente no ADO.NET. Como existe um prazo, não tenho certeza se posso esperar que esse bug seja corrigido e espero que alguém possa me ajudar com uma solução limpa.
O problema é que a consulta usa os valores 1 e 5 em locais onde deve ser 0,01 e 0,05. No entanto, estranhamente, 0,1 parece estar funcionando
A consulta gerada atualmente é: (obtida do SQL Server Profiler)
declare @p3 dbo.someUDT
insert into @p3 values(NULL,5)
insert into @p3 values(5,0.10)
insert into @p3 values(NULL,1)
insert into @p3 values(1,2)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
Enquanto o código correto seria:
declare @p3 dbo.someUDT
insert into @p3 values(NULL,0.05)
insert into @p3 values(0.05,0.10)
insert into @p3 values(NULL,0.01)
insert into @p3 values(0.01,0.02)
exec sp_executesql N'Select * from @AName',N'@AName [dbo].[someUDT] READONLY',@AName=@p3
Já criei um problema no github aqui: Tabela definida pelo usuário, inserindo valor errado
Desejo usar uma tabela definida pelo usuário em minha consulta parametrizada, esta pergunta explica como isso é feito: Entity Framework Stored Procedure Table Value Parameter
Este é o código C # usado para obter o código SQL acima
DataTable dataTable = new DataTable();
dataTable.Columns.Add("value1", typeof(decimal));
dataTable.Columns.Add("value2", typeof(decimal));
dataTable.Rows.Add(null,0.05m);
dataTable.Rows.Add(0.05m,0.1m);
dataTable.Rows.Add(null,0.01m);
dataTable.Rows.Add(0.01m,0.02m);
List<SqlParameter> Parameters = new List<SqlParameter>();
Parameters.Add(new SqlParameter("@AName", SqlDbType.Structured) { Value = dataTable , TypeName= "dbo.someUDT" });
dbContext.Database.ExecuteSqlCommand("Select * from @AName", Parameters.ToArray());
E código SQL para obter a tabela definida pelo usuário
CREATE TYPE [dbo].[someUDT] AS TABLE
(
[value1] [decimal](16, 5) NULL,
[value2] [decimal](16, 5) NULL
)
Edição:
Gert Arnold descobriu. Com base em sua resposta, encontrei um relatório existente aqui. A coluna TextData do SQL Server Profiler lida com entradas decimais incorretamente
Select * from @AName
é um espaço reservado. Na verdade, estou ingressando na tabela em uma consulta maior que não achei relevante para a pergunta, pois isso já replica o problema em um formato mais simples.
Database.SqlQuery
(em vez de Database.ExecuteSqlCommand
) recebo os valores corretos no cliente!
dataTable.Rows.Add(null,0.05m);
e verificar o que consultá-lo gera