2012-11-20 14 views
7

Występuje problem z SQL Server 2012 z powodu braku obsługi dla operatora *= (LEFT OUTER JOIN).Składnia SQL dla LEFT OUTER JOIN w SQL Server 2012

Czy ktoś może mi powiedzieć, jaka jest poprawna składnia SQL Server 2012 dla następującego SQL, który działał poprawnie na SQL Server 2008?

SELECT 
    t7410.name, t7408.type, t7410.length, 
    t7410.status, t7410.prec, t7410.scale, 
    t7409.type 
FROM 
    dbo.syscolumns t7410, dbo.systypes t7408, 
    dbo.sysobjects t7409, dbo.sysusers t7411, 
    master.dbo.syslogins t7412 
WHERE 
    t7410.id = t7409.id 
    AND t7411.uid = t7409.uid 
    AND t7409.name = 'GENERAL' 
    AND t7409.type IN ('U', 'S', 'V') 
    AND t7410.usertype *= t7408.usertype 
    AND t7412.sid = t7411.sid 
    AND t7412.name = user_name() 
ORDER BY 
    t7410.colid ASC 
+0

Oh my nawet nie wie, że można było zrobić. – Zane

+1

Domyślnie zostały one niedozwolone w SQL 2000 ?. Ostatnim razem użyłem ich Sql Server 6.0! –

+11

[Złe nawyki do skopania: używanie JOINów w starym stylu] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-ins. aspx) - stary styl "rozdzielany przecinkami stylów tabel" został ** przerwany ** z ANSI - ** 92 ** SQL Standard ... –

Odpowiedz

19

Dlaczego nie napisać to używając ANSI JOIN składni:

SELECT t7410.name, t7408.type, t7410.length, 
    t7410.status, t7410.prec, t7410.scale, 
    t7409.type 
FROM dbo.syscolumns t7410 
INNER JOIN dbo.sysobjects t7409 
    ON t7410.id = t7409.id 
INNER JOIN dbo.sysusers t7411 
    ON t7411.uid = t7409.uid 
INNER JOIN master.dbo.syslogins t7412 
    ON t7412.sid = t7411.sid 
LEFT JOIN dbo.systypes t7408 
    ON t7410.usertype = t7408.usertype 
WHERE t7409.name = 'GENERAL' 
    AND t7409.type IN ('U', 'S', 'V') 
    AND t7412.name = user_name() 
ORDER BY t7410.colid ASC 
+1

Hmm bij mnie, pracowałem po swojemu. –

+5

+1, używanie jawnych JOINów jest dużo czystsze –

+0

Ostatnim razem, gdy zobaczyłem notację gwiazdy, kiedy opracowałem Oracle ... – devio