Recentemente, solucionei alguns problemas com um aplicativo de terceiros em relação a configurações regionais e separadores decimais. O detalhe desses problemas não é muito relevante, exceto para dizer que o aplicativo é um serviço da web lendo uma coluna do SQL Server com o tipo de dados money e que parece multiplicar o valor porque um separador decimal está sendo interpretado como milhar separador.
Isso me leva à pergunta: No decorrer de minhas investigações, notei que se eu abrir o SSMS e executar o seguinte, recebo "1,00" retornado:
declare @money money;
set @money = 1;
select @money;
No entanto, se eu executar o seguinte no mesmo servidor, recebo "1.00" retornado:
declare @decimal decimal(18,2);
set @decimal = 1;
select @decimal;
Minhas configurações regionais do Windows aqui estão configuradas para usar uma vírgula como separador decimal, portanto, aparentemente, o valor do dinheiro é exibido corretamente e o decimal não.
O que está acontecendo aqui? Não está claro por que o comportamento é diferente para esses dois tipos de dados. Isso é devido ao SQL Server ou é causado pela estrutura .Net? (O aplicativo utiliza a estrutura .Net e presumivelmente o SSMS está fazendo isso da mesma maneira...)
Encontrei o seguinte tíquete que parece se referir ao mesmo problema, mas não parece fornecer uma resposta: https://connect.microsoft.com/SQLServer/feedback/details/636074/some-datatypes-doesnt-honor-localization
A implementação ToString() no tipo SqlDecimal em System.Data.Types contém isso como a etapa final do algoritmo:
Observe que há um '.' codificado permanentemente. lá? O SqlMoney não tem isso, pois chama um formato específico que usa o arquivo cultureinfo atual.