SQL Server * = Operatore?

Oggi mentre all’interno del sistema di produzione di un cliente, ho trovato una query di SQL Server che conteneva una syntax non familiare. Nell’esempio seguente, cosa fa l’operatore *= ? Non ho trovato alcuna menzione su MSDN . La query esegue e restituisce i dati. Per quanto ne sappiamo, questo è stato nel sistema dal momento che stavano usando SQL Server 2000, ma ora sono in esecuzione 2005.

 declare @nProduct int declare @iPricingType int declare @nMCC int set @nProduct = 4 set @iPricingType = 2 set @nMCC = 230 --Build SQL for factor matrix Select distinct base.uiBase_Price_ID, base.nNoteRate, base.sDeliveryOpt, IsNull(base.nPrice,0) as nPrice, IsNull(base.nPrice,0) + Isnull(fact.nFactor,0) as nAdjPrice, base.iProduct_ID, fact.iPosition as fiPosition, base.iPosition, CONVERT(varchar(20), base.dtDate_Updated, 101) + ' ' + CONVERT(varchar(20), base.dtDate_Updated, 108) as 'dtDate_Updated', fact.nFactor, fact.nTreasFactor, product.sProduct_txt , pfi.sPFI_Name, mccprod.nServicing_Fee, fact.nNoteRate as fNoteRate, mcc.nLRA_Charge as nLRA From tbl_Base_Prices base, tbl_Factors fact, tbl_Product product, tbl_PFI pfi, tbl_MCC mcc, tbl_MCC_Product mccprod Where base.iProduct_ID = @nProduct And base.iProduct_ID *= fact.iProduct_ID And base.iPosition *= fact.iPosition And base.nNoteRate *= fact.nNoteRate And base.iPricing_Type = @iPricingType And fact.iMCC_ID = @nMCC And fact.iProduct_ID = @nProduct And mcc.iMCC_ID = @nMCC And mcc.iPFI_ID = pfi.iPFI_ID And mccprod.iMCC_ID = @nMCC And mccprod.iProduct_ID = @nProduct And base.iProduct_ID = product.iProduct_ID and fact.iPricing_Type= @iPricingType Order By base.nNoteRate, base.iPosition 

Rimuovere immediatamente questo codice e sostituirlo con un join sinistro. Questo codice non sempre interpreta correttamente (a volte SQL Server decide che è un cross join) anche in SQL Server 2000 e quindi può dare risultati errati! Inoltre è deprecato per il futuro.

Aggiungo che aggiustando i join di sinistra dovresti rimuovere anche tutti gli altri join impliciti. La syntax implicita della join è stata obsoleta dal 1992, non ci sono scuse perché è ancora in codice di produzione. E mescolare join impliciti ed espliciti può dare risultati inaspettati.

È un join esterno sinistro, = * è un join esterno destro.

Ad esempio i seguenti sono uguali;

  SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.FK_ID SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID 

La syntax non ANSI per outer join ( *= e =* ) si trova nell’elenco ufficiale delle funzionalità deprecate che verranno rimosse nella prossima versione di SQL .

Le seguenti funzionalità del motore di database di SQL Server non saranno supportate nella prossima versione di SQL Server. Non utilizzare queste funzionalità in un nuovo lavoro di sviluppo e modificare le applicazioni che attualmente utilizzano queste funzionalità il prima ansible.

La funzione di sostituzione è la syntax ANSI compatibile di JOIN .

È una syntax di syntax abbreviata. Dai un’occhiata a questo thread che tratta questo argomento.

Sintassi dell’abbreviazione Transact-SQL?

Credo che si tratti di “operatori esterni non ANSI”. Il livello di compatibilità del database deve essere 80 o inferiore.

Quella è la precedente syntax ANSI (ANSI-89) left outer join operator. Mi raccomando di non usarlo – la syntax ANSI è più prolissa ed è molto più leggibile.