存储过程数据类型

本文关键字:数据类型 存储过程 | 更新日期: 2023-09-27 18:09:15

考虑到SQL Server存储过程的复杂性,我决定创建一个SQLCLR存储过程来代替它。

问题:当我们编写CLR存储过程时,是否有任何数据类型或API限制?如果是这样,谁能给我一点提示吗?

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

存储过程数据类型

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

从基础开始,细微差别取决于你使用的SQL Server的版本,以及问的是哪个特定的问题。

。. NET框架版本

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

。. NET框架库和数据类型映射

SQL Server 2005

支持的。net框架库:

  • CustomMarshalers
  • 微软。VisualBasic
  • 微软。VisualC
  • mscorlib
  • 系统
  • 系统。配置
  • 系统。数据
  • System.Data.OracleClient
  • System.Data.SqlXml
  • 系统。部署
  • 系统。安全
  • 系统。交易
  • System.Web.Services
  • System.Xml
数据类型:

  • 细节:SQL Server数据类型和它们的。net框架等同物
  • 包含更多信息的主页面(如处理null等):.NET框架中的SQL Server数据类型

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

支持的。net框架库: (2个库添加如下)

  • CustomMarshalers
  • 微软。VisualBasic
  • 微软。VisualC
  • mscorlib
  • 系统
  • 系统。配置
  • 系统。数据
  • System.Data.OracleClient
  • System.Data.SqlXml
  • 系统。部署
  • 系统。安全
  • 系统。交易
  • System.Web.Services
  • System.Xml
  • System.Core.dll (添加于SQL Server 2008)
  • System.Xml.Linq.dll (添加于SQL Server 2008)
数据类型:

  • 细节:SQL Server数据类型和它们的。net框架等同物
  • 包含更多信息的主页面(如处理null等):.NET框架中的SQL Server数据类型
<标题> Misc。
  • 关于数据类型:如果有一个Sql*类型可用(例如SqlInt32),然后使用它;不要在c#方法中使用。net类型作为输入参数(例如intInt32)。如果SQL Server数据类型没有要映射到的Sql*类型,则仅使用本机。net类型。此异常的两个常见实例是使用object(可以是DbNull.Value)映射到SQL_VARIANT,以及使用DateTime/DateTime?映射到DATETIME2
  • 你可以引用/使用第三方程序集以及上面列出的框架库,但是你需要用PERMISSION_SETUNSAFE将它们导入到你的代码所在的数据库中。为了将它们设置为UNSAFE,您可能还需要将数据库设置为TRUSTWORTHY ON,因为从Microsoft提供的dll中创建非对称密钥似乎不可能(无论如何,我找不到)。
  • 一般来说,任何基于。net 2.0编写的东西都可以在SQL Server 2005中工作,也可以在SQL Server的任何后续版本中工作。我还没有遇到一些在2005年的。net 2.0中工作的东西,在2005年以后的任何版本中都不能工作。
  • 不能将表值参数(tvp)传递给基于sqlclr的对象(存储过程、函数等)。这一点,以及其他一些有用的信息,在CLR存储过程
  • 的MSDN文档中都有说明
  • 我在使用List<T>, DataTableDataRow[]时没有看到任何问题。
  • 我没有使用Queuevar,但使用时不会出现任何问题。
  • 自从我尝试LINQ以来已经有好几年了,但似乎记得唯一的问题是它没有包含在SQL Server 2005支持的框架库中,所以这对我不起作用,因为我需要支持2005 - 2014,但对于任何不需要担心SQL Server 2005的人来说,它应该是好的。
  • 关于SQLCLR主题的更多细节,我在SQL Server Central上有一系列文章(需要免费注册):