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 > ''
我正在从 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 年的结果是:
嗯,问题就出在这里:
((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 > ''