2015-11-12 2 views
1

Я занимаюсь обновлением до SQL Server 2012 с 2005 года и столкнулся с синтаксической ошибкой, с которой мне нужна помощь. Синтаксическая ошибка на самом деле находится в базе данных, которая была построена в 2000 году, поэтому проблема совместимости не может быть исправлена ​​в настройках.SQL 2005 - 2012

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 являются: enter image description here От 20012 вы можете увидеть столбец без имени имеет то же значение для всех строк, и это где проблема: enter image description here Как всегда, любая помощь приветствуется!

ответ

1

Ну, проблема лежит здесь:

((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_id таблицы ППБ в. Это означает, что вы конкатенации каждый матч для каждой строки (даже если 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 > '' 

Кстати, заявление о произношении буквально ничего не делает. Вы можете просто удалить его, если хотите.

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 > '' 
+0

Легендарный! Это прекрасно решает мою проблему. У вас возникли какие-либо идеи относительно того, почему он работал в 2005 году? – Bmize729

+1

Я не уверен на 100%, но я считаю, что это связано с тем, что в 2005 году псевдоним внутри скобок (PPB) не смотрел таблицу PPB внутри скобок, тогда как в 2008 году это было. Например, если вы переименовали псевдоним таблицы вне скобок, скажем, PPBX, и запустили тот же запрос, заменив PPB.ppb_id в скобках с помощью PPBX.ppb_id, это сработало бы. – ZLK

+1

, например. Выберите PPBX *, SUBSTRING (ВЕЩЕСТВО ((выберите license_id при к -. * ОТ LMACatscan..license КАК L ГДЕ L.archived = 0 И ((L.ppb_id В (ВЫБРАТЬ ppb_id ОТ LMACatscan. .ppb WHERE ppb_id = PPBX.ppb_id)) OR (L.ppb_id_2 IN (SELECT ppb_id FROM LMACatscan..ppb WHERE ppb_id = PPBX.ppb_id))) FOR XML PATH ('')), 1,0, ''), 2,999999) ОТ LMACatscan..ppb AS PPBX ГДЕ state_code> «» (это, вероятно, также работать в 2008 году, хотя я не проверял) – ZLK

Смежные вопросы