В SQL Server со средой CLR хранимые функции, кажется, круглые десятичные числа в int на выходе
Когда я создаю ТАБЛИЧНОЗНАЧНУЮ функцию CLR в C#, возвращающую IEnumerable, чтобы возвращать строки данных, а определение таблицы содержит десятичное число (например, "decimal(10,4)"), значения кажутся округленными до целых значений, когда они фактически создаются: тип данных по-прежнему десятичный(10,4), но значение не будет содержать дробной части.
Похоже, это начало происходить недавно: код, который работал в течение многих лет, ошибается, если я перекомпилирую его и повторно разверну сегодня. "float" работает нормально; это просто "decimal", который, кажется, влияет. Существующий код (скомпилированный месяцы или годы назад и развернутый затем) по-прежнему работает нормально.
Кто-нибудь еще это заметил?
Вот тестовый пример: в этом случае "select * from Example()" будет усекать десятичные дроби, возвращая Dan: 36, Dave: 72:
using Microsoft.SqlServer.Server; using System.Collections; using System.Data.SqlTypes; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction( DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read, IsDeterministic = true, FillRowMethodName = "FillTest", TableDefinition = "Name varchar(50), Value decimal(10,4)")] public static IEnumerable Example() { return new[] { new Person("Dan", 36.294), new Person("Dave", 72.492) }; } private class Person { public Person(string Name, double Value) { this.Name = Name; this.Value = Value; } public string Name; public double Value; } private static void FillTest(object Data, out SqlString Name, out SqlDecimal Value) { Person P = Data as Person; Name = new SqlString(P.Name); Value = new SqlDecimal(P.Value); } }
Что я уже пробовал:
Я пробовал использовать "float" вместо типа "decimal", используя "SqlDouble" в процедуре заполнения, и это работает. Но я хотел бы использовать тип "decimal", потому что он позволяет мне указывать точное количество цифр в выходных данных.
Richard MacCutchan
Цитата:это позволяет мне указать точное количество цифр в выходных данных.
Это также допускают как поплавковые, так и двойные типы. Именно форматирование вывода определяет количество цифр, а не базовое значение.
Herman<T>.Instance
скучаю по выходу из дома :
возврат нового[]
{
новый человек(out "Dan", out 36.294),
новый человек(out "Dave", out 72.492)
};
??