5 Aralık 2008 Cuma

"The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current d

HATA MESAJI:
"The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes."

AÇIKLAMA:
SQL Server 2005 veya daha üst versiyonlarında böyle bir hata mesajı ile karşılaşabilirsiniz.

Aslında hata mesajı, hatanın nedenini ve çözümünü açıklayıcıdır. Fakat İngilizce ile sorunu olan arkadaşlar için yine de bu hatayı belgelemek istedim.

Sorun, "*=" ve "=*" operatörlerinin SQL Server 2005 ve daha üstü versiyonlarda artık desteklenmediğinden kaynaklanmaktadır. Bu desteğin çekileceği uzun zaman boyunca uzmanlar ve Microsoft tarafından belirtilmişti.

ÇÖZÜM:
Şayet SQL Server 2000 ve daha öncesinden gelen View, Stored Procedure veya diğer kodlarınızın içinde bulunan bu JOIN operatörlerini değiştirmediyseniz, aşağıda belirtildiği gibi değişiklik yapmanız sorunu çözecektir.

"*=" JOIN operatörü yerine "LEFT JOIN",
"=*" JOIN operatörü yerine de "RIGHT JOIN" komutlarını kullanabilirsiniz.

Eskisi:
USE AdventureWorks
GO
SELECT * FROM Sales.salesPerson AS salesPerson, Sales.salesTerritory AS salesTerritory
WHERE salesPerson.territoryId *= salesTerritory.territoryId

Yenisi:
SELECT * FROM Sales.salesPerson AS salesPerson
LEFT OUTER JOIN sales.salesTerritory AS salesTerritory
ON salesPerson.territoryId = salesTerritory.territoryId

Hiç yorum yok: