Подтвердить что ты не робот

Почему типы CLR, полученные из дженериков, не поддерживаемых в SQL Server 2008 и последующих?

Следующий код реализует UDT, который происходит из общего (SortedDictionary):

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.UserDefined, MaxByteSize = 8000)]
public class udtMassSpectra : SortedDictionary<float, float>, INullable, IBinarySerialize, ICloneable, IDisposable
{
...
}

Создание типа (T-SQL):

CREATE TYPE dbo.udtMassSpectra EXTERNAL NAME MassSpectra.udtMassSpectra;

выдает исключение:

Msg 10331, уровень 16, состояние 1, строка 1 Тип 'udtMassSpectra' в сборке "MassSpectra" происходит от общего типа, который не поддерживается для Тип CLR.

В чем причина? Существует ли какое-либо обходное решение, кроме скрытия базового класса в частном члене? Этот код отлично работает на SQL Server 2005.

4b9b3361

Ответ 1

Еще одно предложение:

Убедитесь, что тип был определен как класс, не является примитивным, вложенным или общий

PS:

Насколько "работал на MSSQL 2005, но не MSSQL 2008", - цитирую Тома Петти: "Тебе повезло, детка!";)

Ответ 2

У меня нет опыта работы с UDT, но, возможно, проблема в том, что float не может представлять значение NULL SQL-Server.

Я провел некоторое исследование и нашел здесь здесь

Ответ 3

Вы можете просто обойти это ограничение, сохранив экземпляр SortedDictionary<float, float> в своем UDT.

Просто из любопытства я хотел бы посмотреть, как генерируется общий класс в контексте T-SQL, как тип данных столбца, переменная и т.д.