Принятый ответ, хотя и разрешающий проблему ОП, является только частично правильным и представляет слишком упрощенное объяснение первопричины, которая может привести других людей с подобной проблемой в неправильном направлении.
Проблема с принятым ответом - неправильное понимание среды .NET, и то же самое недоразумение можно увидеть и в самом Вопросе.В .NET CLR и Framework - это две разные вещи, каждая со своими версиями.
CLR (Common Language Runtime) - это то, что выполняет управляемый код.Это обновляется не так часто, как Framework..NET Framework - это набор библиотек, которые предоставляют основные средства взаимодействия с конкретной версией CLR.
Одна версия CLR обычно имеет несколько версий Framework, с которыми она работает.Однако одна версия Framework работает только с одной конкретной версией CLR.Например, CLR версии 2.0 работает с Framework версии 2.0, 3.0 и 3.5, а CLR версии 4.0 работает со всеми версиями .NET Framework 4.x (т. Е. 4.0, 4.5, 4.5.1, 4.5.2, 4.6., так далее).Чтобы увидеть диаграмму отношения CLR verion к версии Framework, см. Страницу MSDN для .NET Framework Версии и зависимости .
Что касается кода SQLCLR, SQL Server работает только с одной версиейCLR, и конкретная версия зависит от версии SQL Server.SQL Server 2005, 2008 и 2008 R2 работают только с CLR версии 2. Поскольку CLR версии 2 работает только с .NET Framework версий 2.0, 3.0 и 3.5, это означает, что SQL Server 2005, 2008 и 2008 R2 работают только с.NET Framework версии 2.0, 3.0 и 3.5.Конечно, SQL Server 2005 включал только .NET Framework версии 2.0, поэтому в .NET Framework версии 3.0 и 3.5 есть несколько более новых библиотек, которые не работают в SQL Server 2005 без их импорта вручную (например, System.Core и System.Xml.Linq ).В том же духе SQL Server 2012, 2014 и 2016 статически связаны с CLR версии 4, которая работает с .NET Framework версий 4.0, 4.5, 4.5.1, 4.5.2, 4.6.
В отношениик информации, возвращаемой как System.Environment.Version
(в вопросе), так и sys.dm_clr_properties.version
(в принятом ответе), они сообщают о версии CLR , не Framework версия.Поэтому будьте осторожны, чтобы не путать эти две вещи, сообщающие о 2.0 или 4.0, как о значении, что вы можете использовать только Framework версии 2.0 или 4.0.
И, к счастью, из-за обратной совместимости, код, скомпилированный с версиями CLR 2 Framework (2.0,3.0 и 3.5) будут работать без необходимости перекомпиляции в SQL Server 2012 и новее, даже если они на CLR версии 4.
Итак, вы, как правило, не ошибетесь с использованием Target Framework версии 2.0,но вы наверняка можете использовать версии Framework выше 2.0.
Для более глубокого взгляда на разработку кода SQLCLR ознакомьтесь со следующей статьей (и серией в целом), которую я написал:
Лестница в SQLCLR Уровень 5: Разработка (Использование .NET в SQL Server)