SQL 2005 年至 2012 年

SQL 2005 to 2012

我正在从 2005 年升级到 SQL Server 2012,遇到语法错误,需要帮助。语法错误实际上是在 2000 年构建的数据库中,因此无法在设置中修复兼容性问题。

    Select      PPB.*,      

    SUBSTRING(STUFF((select license_id as k   --*
    FROM LMACatscan..license AS L 
          WHERE L.archived = 0 
                AND ((L.ppb_id IN (SELECT ppb_id FROM LMACatscan..ppb WHERE ppb_id = PPB.ppb_id)) 
                OR (L.ppb_id_2 IN (SELECT ppb_id FROM LMACatscan..ppb WHERE ppb_id = PPB.ppb_id)))
                FOR XML PATH('')),1,0,''),2,999999)    
                FROM   LMACatscan..ppb AS PPB    
                WHERE  state_code > ''

2005 年的结果是: 从 20012 年开始,您可以看到没有名称的列对所有行都具有相同的值,这就是问题所在:一如既往,我们将不胜感激!

嗯,问题就出在这里:

((L.ppb_id IN (SELECT ppb_id FROM LMACatscan..ppb WHERE ppb_id = PPB.ppb_id)) 
OR (L.ppb_id_2 IN (SELECT ppb_id FROM LMACatscan..ppb WHERE ppb_id = PPB.ppb_id)))

它所做的是从 license_id 列中选择所有内容,其中 ppb_id 或 ppb_id_2 在 PPB table 的 ppb_id 中柱子。这意味着您要连接每一行的每个匹配项(即使许可证 table 中不存在 ppb_id,它仍会在该行显示)

这应该可以解决问题:

SELECT PPB.*,
    SUBSTRING(STUFF((SELECT license_id k
        FROM LMACatscan..license L
        WHERE (L.ppb_id = PPB.ppb_id
        OR L.ppb_id_2 = PPB.ppb_id)
        AND L.Archived = 0
        FOR XML PATH('')),1,0,''),2,999999)
FROM LMACatscan..ppb PPB
WHERE state_code > ''

顺便说一下,stuff 语句实际上什么都不做。如果你愿意,你可以删除它。

SELECT PPB.*,
    SUBSTRING((SELECT license_id k
        FROM license L
        WHERE (L.ppb_id = PPB.ppb_id
        OR L.ppb_id_2 = PPB.ppb_id)
        AND L.Archived = 0
        FOR XML PATH('')),2,99999)
FROM PPB
WHERE state_code > ''