【问题标题】:SQLCLR Stored procedure datatypesSQLCLR 存储过程数据类型
【发布时间】:2014-08-09 23:41:46
【问题描述】:

我决定创建一个 SQLCLR 存储过程来代替 SQL Server 存储过程,因为它很复杂。

问题:我们在写CLR存储过程的时候有什么数据类型或者API限制吗?如果是这样,有人可以给我任何提示。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    .NET 框架版本

    • 不允许混合模式:SQL Server CLR Host内只能使用一个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:

    • 自定义编组器
    • Microsoft.VisualBasic
    • Microsoft.VisualC
    • mscorlib
    • 系统
    • 系统配置
    • System.Data
    • System.Data.OracleClient
    • System.Data.SqlXml
    • System.Deployment
    • 系统安全
    • System.Transactions
    • System.Web.Services
    • System.Xml

    数据类型:

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

    Supported .NET Framework Libraries:添加了 2 个库,如下所述

    • 自定义编组器
    • Microsoft.VisualBasic
    • Microsoft.VisualC
    • mscorlib
    • 系统
    • 系统配置
    • System.Data
    • System.Data.OracleClient
    • System.Data.SqlXml
    • System.Deployment
    • 系统安全
    • 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_VARIANT,以及使用DateTime / DateTime? 映射到DATETIME2
    • 您可以引用/使用上面列出的之外的第 3 方程序集以及框架库,但是您需要将它们与 PERMISSION_SETUNSAFE 一起导入到您的代码也驻留的数据库中。您可能还需要将数据库设置为 TRUSTWORTHY ON 以便将它们设置为 UNSAFE,因为从 Microsoft 提供的 DLL 中创建非对称密钥似乎是不可能的(反正我找不到)。
    • 一般而言,针对 .NET 2.0 编写的任何可以在 SQL Server 2005 中运行的东西都应该可以在任何更高版本的 SQL Server 中运行。我还没有遇到过在 2005 年的 .NET 2.0 中有效但在 2005 年以后的任何版本中都无效的东西。
    • 不能将表值参数 (TVP) 传递到基于 SQLCLR 的对象(存储过程、函数等)中。在CLR Stored Procedures 的 MSDN 文档中记录了这一点以及其他一些有用的信息
    • 我在使用List<T>DataTableDataRow[] 时没有发现任何问题。
    • 我没有使用过Queuevar,但预计在使用它们时不会出现任何问题。
    • 自从我尝试LINQ 以来已经有好几年了,但似乎记得唯一的问题是它没有包含在 SQL Server 2005 支持的框架库集中,所以这对我不起作用,因为我需要支持 2005 - 2014,但对于不需要担心 SQL Server 2005 的任何人应该没问题。
    • 更多关于SQLCLR的话题,我有SQL Server Central的系列文章(需要免费注册):Stairway to SQLCLR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多