SQLCLR存储过程安装失败:参数类型不匹配问题求助
解决CLR存储过程参数类型不匹配的问题
你遇到的这个错误完全是因为CLR参数类型和T-SQL参数类型不匹配导致的,咱们直接来解决:
问题根源
你的C#代码里给存储过程参数用的是SqlString类型,它在SQL Server里对应的是Unicode字符类型(比如nvarchar、nchar或者已废弃的ntext),但你创建T-SQL存储过程时用的是text类型——这是个非Unicode的旧类型,和SqlString完全不兼容,所以触发了类型不匹配的错误。
修复步骤
修改T-SQL存储过程定义
把所有text类型替换成推荐的nvarchar(max)(text已经被SQL Server标记为过时,不建议再使用),修改后的代码如下:Create Procedure sp_GetDistanceAndTime(@Profile nvarchar(max), @StartPosition nvarchar(max), @Destination nvarchar(max)) AS External NAME GetPvt.StoredProcedures.SqlStoredProcedure1 go先删除旧存储过程(如果已存在)
如果之前已经创建过sp_GetDistanceAndTime,需要先删掉旧的再重新创建:DROP PROCEDURE IF EXISTS sp_GetDistanceAndTime; GO -- 执行上面修改后的Create Procedure语句
额外说明:CLR与SQL类型对应规则
为了避免以后再踩类似的坑,记住几个常用的对应关系:
SqlString→ SQL Server的nvarchar/nchar/ntext(优先用nvarchar(max))SqlChars→ 同样对应Unicode字符类型SqlBinary→ 对应varbinary等二进制类型- 非Unicode的
text/varchar对应的CLR类型是SqlBytes或者SqlString加特定配置,但不推荐这么用,直接用Unicode类型更稳妥。
内容的提问来源于stack exchange,提问作者joebohen




