繁体   English   中英

SQL CLR问题VS2010 SQL Server 2012

[英]SQL CLR problems VS2010 SQL Server 2012

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

SqlClrDeploy:
开始将程序集CCOMM_CLR.dll部署到服务器Titan:CBMAPP_REMAS
如果部署为与.NET Server的目标实例不兼容的.NET Framework版本构建的SQL CLR项目,则可能会出现以下错误:“部署错误SQL01268:由于程序集验证失败,程序集的CREATE ASSEMBLY失败”。 要解决此问题,请打开项目的属性,然后更改.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')

我收到这个错误

Msg 6522,Level 16,State 2,Line 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容易得多。

谢谢,克里斯

关于你的第一个问题:

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

我不知道确切的解决方案,但是因为SQL Server 2012在Visual Studio 2010时尚未发布,并且SQL Server 2012引入了新版本的Tabular Data Stream(TDS)协议,Visual Studio 2010工具不会不知道,使用Visual Studio 2012或更高版本进行编译似乎可以解决这个问题。

关于你的第二个问题:

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

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

CREATE FUNCTION HelloXP (@Name NVARCHAR)
RETURNS NVARCHAR
…

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM