2015-01-07 3 views
3

Я пытаюсь создать определенную функцию простой CLR пользователя с помощью Visual Studio 2010 и SQL Server 2012. Он строит просто отлично, но когда я пытаюсь отладки я получаю эту ошибку:SQL CLR проблемы VS2010 SQL Server 2012

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 SQL: 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.

Спасибо, Крис

+0

Я помню аналогичную проблему, когда вам приходилось строить свою сборку с той же версией .NET Framework, что и для SQL-сервера. Я думаю, что в 2012 году было 4.0 и 2008 было 3.5 - но это догадки. Я попытаюсь найти документацию. –

+0

Это может помочь вам определить детали вашего сервера: select * from sys.dm_clr_properties –

+0

Это версия 4, а сборка использует версию 4. Я также пробовал 3.5, 3.0 и 2.0. Те же результаты. – MtnManChris

ответ

2

Что касается вашего первого вопроса:

Deploy error SQL: The database version is not supported.

Я не знаю точное решение, но так как SQL Server 2012 еще не был выпущен в момент Visual Studio 2010, а в SQL Server 2012 появилась новая версия протокола табличного потока данных (TDS), который инструментальная среда Visual Studio 2010 еще не знает, представляется вероятным, что компиляция с 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, как NVARCHAR:

CREATE FUNCTION HelloXP (@Name NVARCHAR) 
RETURNS NVARCHAR 
… 

В соответствии с MSDN documentation for NVARCHAR, если опустить спецификацию емкости, затем предполагается емкость 1 символа (т.е. 2 байта). Строка, созданная в вашем методе C# ("Hello " + theName), содержит более 1 символа (по крайней мере 6 из "Hello ") и поэтому усечена; таким образом, исключение во время выполнения.

Попробуйте изменить тип возврата на NVARCHAR(100) или NVARCHAR(MAX). То же самое касается входного параметра, @Name. Убедитесь, что тип возврата имеет емкость не менее 6 символов больше, чем емкость @Name.

+0

Да, я предположил, что проблема с VS2010-SQL2012 была проблемой. Я надеялся найти шаблон, который будет работать с 2012 годом, но я не мог найти его в поиске.Поэтому я попытался вручную установить его на сервер. ANSWER должен изменить nvarchar на определенный размер. Это сработало. – MtnManChris

Смежные вопросы