Operand type clash: datetime2与tinyint不兼容问题(MSSQL环境)求助
我之前切换到MSSQL开发时也踩过这个类型冲突的坑,给你几个实际可行的排查和解决思路:
检查ORM实体与数据库字段的映射配置
如果你用了EF Core这类ORM框架,大概率是实体类属性和数据库字段的类型不匹配。比如实体里定义了DateTime类型的属性,但数据库对应的字段却是tinyint;或者反过来,代码里用byte/bool类型的变量去给datetime2字段赋值。可以检查Fluent API的映射代码,或者实体类上的Data Annotation特性(比如[Column(TypeName = "datetime2")])是不是写错了。排查SQL语句的参数类型匹配
如果是手写的SQL语句(包括你提到的Controller Query),仔细核对每个参数的类型和目标字段类型是否一致。比如有没有把表示状态的tinyint参数(0/1)误传到datetime2类型的字段位置?可以开启SQL Server Profiler或者EF的日志功能,把实际执行的SQL语句和参数信息打印出来,直接看哪里类型不匹配。检查存储过程或触发器的逻辑
如果业务中用到了存储过程或者数据库触发器,排查里面的变量赋值逻辑。比如存储过程的参数类型定义错误,或者触发器里把tinyint类型的字段值赋值给了datetime2类型的字段,这也会触发这个错误。排查数据迁移遗留的类型问题
如果是从其他数据库(比如MySQL)迁移到MSSQL的项目,可能存在数据类型转换不彻底的情况。比如原数据库中用tinyint存储时间戳数值,迁移到MSSQL后没转换成datetime2类型,导致插入/更新数据时出现类型冲突。
如果经过以上排查还是没找到问题,可以把出现错误的相关代码片段(比如实体类定义、SQL语句、ORM映射代码)贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者Andrii Shulhin

