VS2017数据库项目中MERGE语句触发SQL71501错误求助
我之前也碰到过这个问题,SQL71501这个报错本质是Visual Studio的数据库项目无法解析存储过程里MERGE语句的某个对象引用,要么是对象真的不存在,要么是项目配置或语法有问题。下面是几个常见的排查和解决方向:
检查目标表和列是否在项目中
先确认MERGE语句的目标表已经被正确导入到数据库项目里了。有时候导入数据库时可能会漏掉某些表,或者表的结构和存储过程里引用的列不匹配。仔细核对VALUES子句里的列名和目标表的列名,有没有拼写错误、大小写不一致(虽然SQL Server不区分,但VS的数据库项目偶尔会对大小写敏感)。确认源数据的引用有效性
MERGE的USING子句里的源表、视图或者子查询,是不是也包含在当前数据库项目中?如果源是临时表,VS可能无法解析,但如果是正式表,必须确保它在项目里。另外检查源和目标的列引用有没有搞混别名,比如把源表的列写成了目标表的别名,这种低级错误很容易触发这个报错。核对项目的SQL Server兼容性设置
右键你的数据库项目 -> 「属性」-> 「项目设置」,看看「目标平台」是不是和你实际使用的SQL Server版本一致?比如如果你的MERGE用了高版本才支持的语法,但目标平台选了低版本,VS就会报错。同时检查「兼容性级别」是否和目标数据库匹配,这个设置也会影响VS的语法解析。检查MERGE语句的INSERT语法
重点看WHEN NOT MATCHED THEN INSERT这部分的写法是否正确。比如要确保INSERT后面的列列表和VALUES里的列一一对应,而且VALUES里的列必须是能被VS解析到的(比如源表的列或者常量)。举个正确的示例:MERGE INTO dbo.TargetRating AS T USING dbo.SourceRatingData AS S ON T.RatingID = S.RatingID WHEN NOT MATCHED THEN INSERT (RatingValue, RatingDate, UserID) VALUES (S.RatingValue, S.RatingDate, S.UserID);检查你的存储过程里是不是有类似列名写错、漏写的情况。
排查架构和跨数据库引用问题
如果目标表或源表不在dbo架构下,有没有正确指定架构名称?比如是不是写成了[OtherSchema].[RatingTable]而不是[dbo].[RatingTable]?如果MERGE涉及到其他数据库的表,需要给当前项目添加对应的数据库引用,否则VS无法解析跨库对象。清理项目缓存并重建
有时候VS的项目缓存会出问题,试试右键项目 -> 「清理」,然后再右键 -> 「生成」。如果还是不行,可以手动删除项目目录下的obj文件夹,然后重新生成项目,很多时候能解决这种奇怪的解析错误。
内容的提问来源于stack exchange,提问作者Tom H

