SQL CLR 问题 VS2010 SQL Server 2012

SQL CLR problems VS2010 SQL Server 2012

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

SqlClrDeploy:
Beginning deployment of assembly CCOMM_CLR.dll to server Titan : CBMAPP_REMAS
The following error might appear if you deploy a SQL CLR project that was built for a version of the .NET Framework that is incompatible with the target instance of SQL Server: "Deploy error SQL01268: CREATE ASSEMBLY for assembly failed because assembly failed verification". To resolve this issue, open the properties for the project, and change the .NET Framework version. C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlClr.targets(96,5): Deploy error SQL01234: The database version is not supported.

Build FAILED

所以...如何在自己的机器上构建和部署...这是安装程序集和 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')

我收到这个错误

Msg 6522, Level 16, State 2, Line 2
A .NET Framework error occurred during execution of user-defined routine or aggregate "HelloXP": System.Data.SqlServer.TruncationException: Trying to convert return value or output parameter of size 14 bytes to a T-SQL type with a smaller size limit of 2 bytes.
System.Data.SqlServer.TruncationException:
at System.Data.SqlServer.Internal.CXVariantBase.StringToWSTR(String pstrValue, Int64 cbMaxLength, Int32 iOffset, EPadding ePad)

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

谢谢,克里斯

关于您的第一个问题:

Deploy error SQL01234: The database version is not supported.

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

关于您的第二期:

"A .NET Framework error occurred during execution of user-defined routine or aggregate HelloXP: System.Data.SqlServer.TruncationException: Trying to convert return value or output parameter of size 14 bytes to a T-SQL type with a smaller size limit of 2 bytes."

您已将 UDF 的 return 类型声明为 NVARCHAR:

CREATE FUNCTION HelloXP (@Name NVARCHAR)
RETURNS NVARCHAR
…

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

尝试将 return 类型更改为 NVARCHAR(100)NVARCHAR(MAX) 之类的类型。输入参数 @Name 也是如此。确保 return 类型的容量至少比 @Name.

的容量多 6 个字符