You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQLCLR存储过程安装失败:参数类型不匹配问题求助

解决CLR存储过程参数类型不匹配的问题

你遇到的这个错误完全是因为CLR参数类型和T-SQL参数类型不匹配导致的,咱们直接来解决:

问题根源

你的C#代码里给存储过程参数用的是SqlString类型,它在SQL Server里对应的是Unicode字符类型(比如nvarcharnchar或者已废弃的ntext),但你创建T-SQL存储过程时用的是text类型——这是个非Unicode的旧类型,和SqlString完全不兼容,所以触发了类型不匹配的错误。

修复步骤

  1. 修改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
    
  2. 先删除旧存储过程(如果已存在)
    如果之前已经创建过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

火山引擎 最新活动