Oggi mentre all'interno del sistema di produzione di un cliente, ho trovato una query di SQL Server che conteneva una sintassi non familiare. Nell'esempio seguente, cosa fa l'operatore *=
? Non ho potuto trovare alcuna menzione di esso on MSDN. La query esegue e restituisce i dati. Per quanto si sa, questo è stato nel sistema dal momento che stavano usando SQL Server 2000, ma sono ora in esecuzione 2005.SQL Server * = Operatore?
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
'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. So che questo è molto vecchio, ma mi stavo chiedendo se tu avessi una documentazione che supporti questa affermazione? Grazie! – swasheck
* La sintassi SQL-92 è consigliata poiché non è soggetta all'ambiguità che a volte risulta dai legacy outer join di Transact-SQL. * Da [SQL BOL 2000: utilizzo di outer join] (http://msdn.microsoft.com /en-us/library/aa213228(v=sql.80).aspx). Le versioni più recenti di questo argomento non menzionano nemmeno join * * e '= *'. –
Inoltre (grazie a @MikaelEriksson): * L'uso di questa sintassi per i join esterni è scoraggiato a causa del potenziale di interpretazione ambigua e perché non è standard. Invece, specificare i join nella clausola FROM. * Da [SQL 2000 BOL: SELECT] (http://msdn.microsoft.com/en-us/library/aa259187 (v = sql.80) .aspx). –