Dan Sutton Ответов: 0

В 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)
};

??

0 Ответов