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 个字符
我正在尝试使用 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
.