首页 > 解决方案 > SELECT 的行为变化

问题描述

我正在将 SQL Server 2008 数据库迁移到 SQL Server 2019,我使用 Microsoft 数据迁移助手来查找搜索任何行为更改、问题或语法错误。

我有一个 SELECT,它给了我进行迁移的兼容性错误:

对象使用旧式连接语法,在数据库兼容级别 90 或更高时性能较差。

这是我认为会出错的 SELECT:

SELECT 
    @Pro = CEILING((BaseDev * 100) / (ISNULL(BaseExe, 0) + ISNULL(BaseDev, 0)))
FROM 
    (SELECT SUM(Base) 'BaseDev'
     FROM Table1
     WHERE Con = @Con AND Lib <> 0 AND Tip = 1 
       AND Fac = 'V' AND ISNULL(Pct, 0) <> 0) A,
    (SELECT SUM(Base) 'BaseExe'
     FROM Table1
     WHERE Con = @Con AND Lib <> 0 AND Tip = 1 AND Fac = 'V' 
       AND ISNULL(Pct, 0) = 0) B

标签: sqlsql-servermigrationcompatibility

解决方案


您可以完全摆脱JOIN并使用条件聚合:

WITH CTE AS(
    SELECT SUM(CASE WHEN Pct <> 0 THEN Base END) AS BaseDev,
           SUM(CASE WHEN Pct = 0 OR Pct IS NULL THEN Base END) AS BaseExe
    FROM dbo.Table1
    WHERE Con = @Con
      AND Lib <> 0
      AND Tip = 1
      AND Fac = 'V')
SELECT @Pro = CEILING((BaseDev * 100) / (ISNULL(BaseExe, 0) + ISNULL(BaseDev, 0)))
FROM CTE;

也应该更高效,因为它会导致对表进行一次扫描/查找。


推荐阅读