SQL CLR problems VS2010 SQL Server 2012

本文关键字:SQL 2012 Server problems CLR VS2010 | 更新日期: 2023-09-27 18:36:34

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

SqlClr部署:
开始将程序集CCOMM_CLR.dll部署到服务器Titan:CBMAP_REMAS
如果部署的SQL CLR项目是为与SQL Server的目标实例不兼容的.NET Framework版本生成的,则可能会出现以下错误:"部署错误SQL01268:CREATE ASSEMBLY for ASSEMBLY失败,因为ASSEMBLY验证失败"。若要解决此问题,请打开项目的属性,然后更改.NET Framework版本。C: ''Program Files(x86(''MMSBuild''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.TrunationException:试图将大小为14字节的返回值或输出参数转换为大小限制为2字节的T-SQL类型
System.Data.SqlServer.TtruncationException:
在System.Data.SqlServer.Interal.CXVariantBase.StringToWSTR(字符串pstrValue,Int64 cbMaxLength,Int32 iOffset,EPadding ePad(

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

谢谢,Chris

SQL CLR problems VS2010 SQL Server 2012

关于您的第一个问题:

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

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

关于您的第二个问题:

"在执行用户定义例程或聚合HelloXP:System.Data.SqlServer.TruncationException:尝试将大小为14字节的返回值或输出参数转换为大小限制为2字节的T-SQL类型时发生.NET Framework错误。">

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

CREATE FUNCTION HelloXP (@Name NVARCHAR)
RETURNS NVARCHAR
…

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

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