2015-07-21 47 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

值得一注意到自SQL Server 2005以來不推薦使用非ANSI外連接運算符('* ='和'= *'),如果要在SQL Server 2008中使用它們,則需要設置數據庫的兼容級別到80.這可能會導致許多其他進程失敗,您可能需要咬緊牙關並立即用ANSI92連接語法重寫。 – GarethD

+0

我知道 - 在問題中:'(是的,我的兼容模式暫時設置爲支持舊連接)。':) – Kai

回答

2

從文檔上TechNet(!SQL Server 2000上,所以要意識到這可能不支持任何更多),你需要使用*=代替(+)甲骨文的作用:

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

請注意兼容性級別,因爲它不會在較新的數據庫引擎中運行。 。 – OzrenTkalcecKrznaric

+0

@OzrenTkalcecKrznaric:謝謝。我認爲你應該避免使用這個。你爲什麼想要?在我的回答中添加了通知。 –

+0

我會避免它;不過,我會使用與OP(2遍)相同的代碼重寫策略,以避免通過更改選擇行爲來破壞代碼。如果我必須重寫2-3個查詢,我可以抓住我的機會,但是如果它是200-300個查詢...:/ – OzrenTkalcecKrznaric