我正在尝试使用Visual 2010和Server 2012创建一个简单的CLR用户定义函数。它构建得很好,但是当我尝试调试时,我得到了以下错误:
SqlClrDeploy: 开始将程序集CCOMM_CLR.dll部署到服务器Titan : CBMAPP_REMAS 如果为与Server目标实例不兼容的.NET框架版本部署SQL项目,可能会出现以下错误:“部署错误SQL01268:为程序集创建程序集失败,因为程序集验证失败”。若要解决此问题,请打开项目的属性,并更改.NET框架版本。C:\Program (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,第16级,状态2,第2行 .NET框架错误发生在执行用户定义的例程或聚合"HelloXP":System.Data.SqlServer.TruncationException:试图将大小为14字节的返回值或输出参数转换为具有较小的大小限制为2字节的type类型。 System.Data.SqlServer.TruncationException: System.Data.SqlServer.Internal.CXVariantBase.StringToWSTR(String pstrValue,Int64 cbMaxLength,Int32 iOffset,EPadding ePad)
我做错了什么?在MS的例子中,这看起来相当直接,所以有些事情搞砸了。是的,在服务器上启用了CLR。我已经在运行扩展存储过程,它们似乎比CLR容易得多。
谢谢,克里斯
发布于 2015-01-07 21:32:28
关于你的第一期:
部署错误SQL01234:不支持数据库版本。
我不知道确切的解决方案,但由于SQL Server 2012在Visual 2010发布时还没有发布,而且SQL Server 2012引入了一个新版本的表格数据流(TDS)协议,而Visual 2010工具还不知道该协议,所以用Visual 2012或更高版本编译似乎可以解决这个问题。
关于你的第二个问题:
.NET框架错误发生在用户定义的例程或聚合
HelloXP__:System.Data.SqlServer.TruncationException__执行过程中:试图将大小为14字节的返回值或输出参数转换为具有较小的大小限制为2字节的type类型。
您已经将UDF的返回类型声明为NVARCHAR。
CREATE FUNCTION HelloXP (@Name NVARCHAR)
RETURNS NVARCHAR
…根据NVARCHAR,如果省略容量规范,则假定容量为1个字符(即2个字节)。在C#方法("Hello " + theName)中创建的字符串包含超过1个字符(至少6个来自"Hello "),因此被截断;因此,运行时异常。
尝试将返回类型更改为类似于NVARCHAR(100)或NVARCHAR(MAX)的类型。输入参数@Name也是如此。确保返回类型的容量至少比@Name的容量多6个字符。
https://stackoverflow.com/questions/27828662
复制相似问题