SQLCLR存储过程无法安装

时间:2018-05-22 15:02:54

标签: c# sql-server stored-procedures sqldatatypes sqlclr

我在Visual Studio(VS)中创建了一个存储过程。当我在成功创建程序集后尝试安装该过程时,出现错误:

  

sp_GetDistanceAndTime的CREATE PROCEDURE失败,因为参数" @ Profile"的T-SQL和CLR类型不匹配。

如何安装?我的参数不正确吗?

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 :(得分:0)

  1. 切勿使用TEXTNTEXTIMAGE数据类型。这些已经被弃用了13年,从SQL Server 2005的发布开始,它引入了MAX数据类型来替换那些旧的blob类型。
  2. SQLCLR API仅处理Unicode字符串(UTF-16LE)而不处理8位编码。因此,您无法使用CHAR(1 - 8000)VARCHAR(1 - 8000)VARCHAR(MAX)。而且我认为它也不喜欢NCHAR。您的选择是:NCHAR(1 - 4000)NVARCHAR(MAX)。这两个都映射到SqlStringSqlChars
  3. SqlContext.Pipe.Send(string)相当于在T-SQL中使用PRINT。它只是一条显示在SSMS“消息”选项卡中的消息。它既不是返回值也不是OUTPUT参数。

答案 1 :(得分:0)

一个快速示例(根据您的情况修复尺寸等):

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

有关详细信息,请参阅Mapping CLR Parameter Data