相同SQL查询在Power Query(PQ)与SSMS查询结果不一致原因问询
常见导致Power Query与SSMS执行同一条SQL结果不一致的原因
连接层配置差异
- 登录身份/权限不同:Power Query连接数据库时使用的登录账号,和SSMS登录用的账号可能不是同一个,不同账号的行级权限(RLS)、默认schema不同,会直接导致返回的数据集范围、表映射有差异。
- 会话级
SET选项配置差异:SSMS默认会开启一系列会话级配置,比如SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON、SET DATEFORMAT mdy等,而Power Query的默认会话配置可能和SSMS不一致,涉及到空值判断、日期格式、标识符解析的SQL语句,执行结果会直接受影响。可以在SQL语句开头加上和SSMS一致的所有SET选项,再放到PQ中执行验证。 - 数据库上下文不同:SSMS当前选中的数据库、默认schema可能和PQ连接时指定的不一致,如果你的SQL语句没有写全表的三部分名称(
数据库名.schema名.表名),会出现查错表/查错库的情况。
Power Query侧隐式逻辑影响
- 查询折叠未完整生效:如果手动把SQL粘贴到PQ的原生查询框之后,又在PQ图形界面做了额外的筛选、列转换等操作,有可能出现你以为执行的是原始SQL,但实际PQ修改了下发到数据库的查询语句。可以右键PQ查询的最后一步,选择「查看原生查询」确认实际下发到数据库的SQL和你写的是否一致。
- 数据类型隐式转换:PQ的本地数据类型规则和SQL Server不同,比如SQL中的
datetime2高精度值、bit类型、带时区的日期类型,在PQ加载时会默认做转换,导致显示值和SSMS中看到的不一样,本质是本地显示转换的问题,不是查询结果的问题。 - 空值/空白值处理逻辑差异:SSMS中的
NULL和空字符串是严格区分的,PQ默认加载时可能会把空字符串自动识别为null,或者反过来,会出现统计计数、等值匹配结果不一致的情况。
缓存与隔离级别差异
- 缓存复用:SSMS默认返回实时查询结果,而PQ会默认缓存数据源的历史查询结果,可在PQ的数据源设置中清除该数据库的缓存,再刷新查询验证。
- 事务隔离级别不同:SSMS默认的事务隔离级别一般是
READ COMMITTED,而PQ的数据库连接默认隔离级别可能不同,如果查询时刚好有数据写入,会出现脏读、不可重复读类的结果差异。
内容的提问来源于stack exchange,提问作者user12317771
相关产品推荐
相关产品推荐

