SQLCLR存储过程数据类型

时间:2014-06-19 12:22:48

标签: c# sql-server stored-procedures sqlclr sqldatatypes

由于其复杂性,我决定创建一个SQLCLR存储过程来替换SQL Server存储过程。

问题:在编写CLR存储过程时是否存在任何数据类型或API限制?如果是这样,有人可以给我任何提醒。

我打算使用var, List<T>, DataTable, DataRow[]Queue以及一些LINQ扩展方法。

1 个答案:

答案 0 :(得分:2)

这实际上是一个相当开放的问题,因为在.NET / CLR代码本身可以做什么以及哪些数据类型可以/应该用作输入/输出参数都有细微差别。

从基础开始,细微差别取决于您使用的SQL Server版本以及要求的特定问题。

.NET Framework版本

  • 不允许使用混合模式:在SQL Server CLR主机中只能使用一个CLR版本,而CLR版本取决于SQL Server的版本且无法更改
  • SQL Server 2005,2008和2008 R2:静态绑定到CLR 2.0
  • SQL Server 2012,2014和2016:静态绑定到CLR 4.0

.NET Framework库和数据类型映射

SQL Server 2005

<强> Supported .NET Framework Libraries

  • CustomMarshalers
  • Microsoft.VisualBasic程序
  • Microsoft.VisualC
  • mscorlib程序
  • 系统
  • System.Configuration
  • System.Data
  • System.Data.OracleClient的
  • System.Data.SqlXml
  • System.Deployment
  • System.Security
  • System.Transactions的
  • System.Web.Services
  • 的System.Xml

数据类型:

SQL Server 2008,2008 R2,2012,2014和2016:

Supported .NET Framework Libraries 2个库添加如下所示

  • CustomMarshalers
  • Microsoft.VisualBasic程序
  • Microsoft.VisualC
  • mscorlib程序
  • 系统
  • System.Configuration
  • System.Data
  • System.Data.OracleClient的
  • System.Data.SqlXml
  • System.Deployment
  • System.Security
  • System.Transactions的
  • System.Web.Services
  • 的System.Xml
  • System.Core.dll(在SQL Server 2008中添加
  • System.Xml.Linq.dll(在SQL Server 2008中添加

数据类型:

杂项

  • 关于数据类型:如果有Sql*类型可用(例如SqlInt32),则使用它;不要在C#方法中使用.NET类型作为输入参数(例如intInt32)。如果要映射的SQL Server数据类型没有Sql*类型,则仅使用本机.NET类型。此异常的两个常见实例是使用object(可以DbNull.Value)映射到SQL_VARIANTDateTime / DateTime?映射到{{{ 1}}。
  • 您可以引用/使用第三方程序集以及上面列出的框架库之外的框架库,但是您需要将DATETIME2 PERMISSION_SET的{​​{1}}导入到您的代码中的数据库中驻留。您可能还需要将数据库设置为UNSAFE,以便将它们设置为TRUSTWORTHY ON,因为从Microsoft提供的DLL创建Asymmetric Key似乎不可能(不是我能找到)
  • 一般来说,任何针对.NET 2.0编写的在SQL Server 2005中运行的内容都应该适用于SQL Server的任何更高版本。我还没有看到2005年在.NET 2.0中运行的某些东西在2005年之后的任何版本中都无效。
  • 您无法将表值参数(TVP)传递到基于SQLCLR的对象(存储过程,函数等)。这一点,以及其他一些有用的信息,请参阅CLR Stored Procedures
  • 的MSDN文档
  • 使用UNSAFEList<T>DataTable时,我没有遇到任何问题。
  • 我没有使用DataRow[]Queue,但在使用时不会出现任何问题。
  • 自从我尝试var以来已经多年了,但似乎回想起唯一的问题是它没有包含在SQL Server 2005支持的框架库集中,所以这对我来说不起作用,因为我需要支持2005年至2014年,但对于任何不需要担心SQL Server 2005的人来说应该可以。
  • 有关SQLCLR主题的更多详细信息,我有一系列关于SQL Server Central的文章(需要免费注册):Stairway to SQLCLR