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