【问题标题】:SQL CLR problems VS2010 SQL Server 2012SQL CLR 问题 VS2010 SQL Server 2012
【发布时间】:2015-03-05 21:23:04
【问题描述】:

我正在尝试使用 Visual Studio 2010 和 SQL Server 2012 创建一个简单的 CLR 用户定义函数。它构建得很好,但是当我尝试调试时出现此错误:

SqlClr部署:
开始将程序集 CCOMM_CLR.dll 部署到服务器 Titan:CBMAPP_REMAS
如果部署为与 SQL Server 目标实例不兼容的 .NET Framework 版本构建的 SQL CLR 项目,则可能会出现以下错误:“部署错误 SQL01268:为程序集创建程序集失败,因为程序集验证失败”。要解决此问题,请打开项目的属性,然后更改 .NET Framework 版本。 C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlClr.targets(96,5):部署错误 SQL01234:不支持数据库版本。

构建失败

那么...如何在它自己的机器上构建和部署...这是安装程序集和 UDF 的代码

CREATE ASSEMBLY CCOMM_CLR 
  FROM 'E:\SQL\ASSEMBLIES\CCOMM_CLr.dll' WITH PERMISSION_SET = SAFE;

CREATE FUNCTION HelloXP(@Name nvarchar )
Returns nvarchar
As EXTERNAL NAME CCOMM_CLR.UserDefinedFunctions.HelloWorld;

这是整个UDF

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString HelloWorld(SqlString theName)
    {
        // Put your code here
        return  "Hello " + theName;
    }
};

程序集和 UDF 的安装工作正常,但是当我运行它时...

Select Master.dbo.HelloXP('Chris')

我收到此错误

消息 6522,第 16 级,状态 2,第 2 行
在执行用户定义的例程或聚合“HelloXP”期间发生 .NET Framework 错误:System.Data.SqlServer.TruncationException:尝试将大小为 14 字节的返回值或输出参数转换为具有较小大小限制的 T-SQL 类型2 个字节。
System.Data.SqlServer.TruncationException:
在 System.Data.SqlServer.Internal.CXVariantBase.StringToWSTR(String pstrValue, Int64 cbMaxLength, Int32 iOffset, EPadding ePad)

我做错了什么?在 MS 的示例中,这似乎相当简单,所以有些事情搞砸了。是的,在服务器上启用了 CLR。我已经在运行扩展存储过程,它们似乎比 CLR 容易得多。

谢谢,克里斯

【问题讨论】:

  • 我记得一个类似的问题,您必须使用 sql server 使用的相同 .NET 框架版本来构建程序集。我认为 2012 年是 4.0,2008 年是 3.5 - 但这些都是猜测。我会尝试查找文档。
  • 这可能会帮助您确定有关服务器的详细信息:select * from sys.dm_clr_properties
  • 现在是版本 4,程序集使用的是版本 4。我也尝试过 3.5、3.0 和 2.0。结果相同。

标签: c# visual-studio-2010 sql-server-2012 clr


【解决方案1】:

关于您的第一个问题:

部署错误 SQL01234:不支持数据库版本。

我不知道确切的解决方案,但由于在 Visual Studio 2010 时 SQL Server 2012 尚未发布,并且 SQL Server 2012 引入了 Visual Studio 的新版本的表格数据流 (TDS) 协议2010 年的工具还不知道,用 Visual Studio 2012 或更高版本编译似乎可以解决这个问题。

关于您的第二个问题:

“在执行用户定义的例程或聚合时发生 .NET Framework 错误HelloXP:System.Data.SqlServer.TruncationException: 尝试将大小为 14 字节的返回值或输出参数转换为带有较小的大小限制为 2 个字节。”

您已将 UDF 的返回类型声明为 NVARCHAR

CREATE FUNCTION HelloXP (@Name NVARCHAR)
RETURNS NVARCHAR
…

根据MSDN documentation for NVARCHAR,如果省略容量规范,则假定容量为 1 个字符(即 2 个字节)。在您的 C# 方法 ("Hello " + theName) 中创建的字符串包含超过 1 个字符(至少来自 "Hello " 的 6 个字符),因此被截断;因此运行时异常。

尝试将返回类型更改为NVARCHAR(100)NVARCHAR(MAX)。输入参数@Name 也是如此。确保返回类型的容量至少比 @Name 的容量多 6 个字符。

【讨论】:

  • 是的,我认为从 VS2010 到 SQL2012 的问题是一个问题。我希望找到一个适用于 2012 年的模板,但我在网上找不到它。因此,我尝试手动将其放在服务器上。答案是将 nvarchar 更改为特定大小。这行得通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多