Не удалось установить хранимую процедуру SQLCLR - PullRequest
0 голосов
/ 22 мая 2018

Я создал хранимую процедуру в Visual Studio (VS).Когда я пытаюсь установить процедуру после успешного создания сборки, я получаю сообщение об ошибке:

CREATE PROCEDURE для sp_GetDistanceAndTime не выполнен, поскольку типы T-SQL и CLR для параметра "@Profile" не совпадают.

Как мне установить это?Мои параметры неверны?

Код C #:

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void SqlStoredProcedure1(SqlString Profile, SqlString StartPosition,
           SqlString Destination)
    {
        try
        {           
            SqlPipe sqlPipe = SqlContext.Pipe;
            string result;
            result = PTVRequest.InvokeService(Profile.ToString(),
                    StartPosition.ToString(), Destination.ToString());

            SqlContext.Pipe.Send(result);
        }
        catch (Exception ex)
        {
            SqlContext.Pipe.Send(ex.Message);
        }

    }
}

Код SQL:

Create Procedure sp_GetDistanceAndTime(@Profile text, @StartPosition text,
 @Destination text)
AS 
External NAME GetPvt.StoredProcedures.SqlStoredProcedure1
go

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Быстрый пример (исправьте размеры в вашем случае и т. Д.):

public static void SqlStoredProcedure1([SqlFacet(MaxSize=100)] string Profile,
[SqlFacet(MaxSize=200)] string StartPosition,
[SqlFacet(MaxSize=100)] string Destination)

И:

CREATE PROCEDURE sp_GetDistanceAndTime
   @Profile nVARCHAR(100), @StartPosition nVARCHAR(200), @Destination nVARCHAR(100)
   AS EXTERNAL NAME GetPvt.StoredProcedures.SqlStoredProcedure1

См. Отображение данных параметров CLR для получения подробной информации.

0 голосов
/ 25 мая 2018
  1. Никогда не используйте типы данных TEXT, NTEXT или IMAGE.Они устарели уже 13 лет, начиная с выпуска SQL Server 2005, который представил типы данных MAX для замены этих старых типов BLOB-объектов.
  2. API SQLCLR обрабатывает только строки Unicode (UTF-16LE) ине 8-битные кодировки.Таким образом, вы не можете использовать CHAR(1 - 8000), VARCHAR(1 - 8000) или VARCHAR(MAX).И я не думаю, что ей нравится NCHAR.Ваш выбор: NCHAR(1 - 4000) или NVARCHAR(MAX).Оба из них отображаются на SqlString и SqlChars.
  3. SqlContext.Pipe.Send(string) эквивалентно использованию PRINT в T-SQL.Это просто сообщение, которое отображается на вкладке «Сообщения» в SSMS.Это не возвращаемое значение и не параметр OUTPUT.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...