2015-07-21 2 views
3

Я переписываю кучу старых, плохо написанных запросов Oracle против новой (-er) среды Sql Server 2008. Они используют синтаксис объединения Oracle в старой школе, такой какЧто такое синтаксис «старого стиля» для объединений в T-Sql?

select <whatever> 
from Table1, Table2, Table3 
where Table1.T1ID = Table2.T2ID  -- old Oracle inner join 
and Table2.T3ID = Table3.T3ID (+) -- old Oracle left join (I think) 

За исключением намного более сложного. Там много смешанных объединений и много гнездования, и многие взгляды складываются на представлениях, происходящих в этих вещах. Это некрасиво. Данные также разрознены между двумя серверами, что делает тестирование работы.

Я понял, что самый простой способ репликации - сделать запросы похожими, насколько это возможно, на Sql Server (то есть, используя тот же стиль соединения), а затем выполнить массивную очистку после того, как я уверенный, что они оба точно делают то же самое & У меня нет ни одного места в другом месте (да, у меня есть режим совместимости, временно установленный для поддержки старых соединений).

Я знаю «старый» синтаксис для внутреннего соединения в T-Sql является

select <whatever> 
from T1, T2 
where T1.ID = T2.ID 

но что это «старый» синтаксис для левого внешнего соединения или правое внешнее соединение?

+1

Стоит отметив, что внешние внешние соединения ANSI ('* =' и '= *') устарели со времен SQL Server 2005, если вы хотите использовать их в SQL Server 2008, вам необходимо установить уровень совместимости вашей базы данных до 80. Это может привести к сбою многих других процессов, вам, вероятно, придется просто укусить пулю и переписать с помощью синтаксиса соединения ANSI92 сразу. – GarethD

+0

Я знаю - в вопросе: '(и да, у меня есть режим совместимости, временно установленный для поддержки старых объединений) .' :) – Kai

ответ

2

Из документации на TechNet (! На SQL Server 2000, так знайте, что это может не поддерживаться больше), вам нужно использовать *= вместо (+) как Oracle делает:

select <whatever> 
from T1, T2 
where T1.ID *= T2.ID 
+1

Обратите внимание на уровень совместимости, поскольку он не будет работать в новых двигателях db. – OzrenTkalcecKrznaric

+0

@OzrenTkalcecKrznaric: Спасибо. Я думаю, вам следует избегать использования этого. Зачем вам это нужно? В ответе добавлено уведомление. –

+0

Я бы тоже избегал этого; однако я бы использовал ту же стратегию для перезаписи кода как OP (2 прохода), чтобы не нарушать код, изменяя поведение выбора. Если мне придется переписать 2-3 вопроса, я мог бы воспользоваться своим шансом, но если это 200-300 запросов ...:/ – OzrenTkalcecKrznaric

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