我在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
答案 0 :(得分:0)
TEXT
,NTEXT
或IMAGE
数据类型。这些已经被弃用了13年,从SQL Server 2005的发布开始,它引入了MAX
数据类型来替换那些旧的blob类型。CHAR(1 - 8000)
,VARCHAR(1 - 8000)
或VARCHAR(MAX)
。而且我认为它也不喜欢NCHAR
。您的选择是:NCHAR(1 - 4000)
或NVARCHAR(MAX)
。这两个都映射到SqlString
和SqlChars
。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。