2009-06-11 16 views
22

Hoy mientras estaba dentro del sistema de producción de un cliente, encontré una consulta de SQL Server que contenía una sintaxis desconocida. En el siguiente ejemplo, ¿qué hace el operador *=? No pude encontrar ninguna mención de él on MSDN. La consulta ejecuta y devuelve datos. En lo que se sabe, esto ha estado en el sistema, ya que estaban utilizando SQL Server 2000, pero ahora están funcionando 2005.SQL Server * = ¿Operador?

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 

Respuesta

24

Elimine este código de inmediato y reemplácelo por uno de la izquierda. Este código no siempre se interpreta correctamente (a veces SQL Server decide que es una combinación cruzada) incluso en SQL Server 2000 y, por lo tanto, puede dar resultados incorrectos. También está en desuso para el futuro.

Voy a agregar que al ajustar las uniones a la izquierda debe eliminar todas las otras combinaciones implícitas también. La sintaxis de unión implícita ha sido obsoleta desde 1992, no hay excusa para que todavía esté en el código de producción. Y mezclar combinaciones implícitas y explícitas puede dar resultados inesperados.

+3

'Este código no siempre se interpreta correctamente (a veces SQL Server decide que es una combinación cruzada) incluso en SQL Server 2000 y por lo tanto puede dar resultados incorrectos. También está obsoleto para el futuro. Sé que esto es muy antiguo, pero me preguntaba si tenía documentación que respalda esta afirmación. ¡Gracias! – swasheck

+2

* Se recomienda la sintaxis de SQL-92 porque no está sujeta a la ambigüedad que a veces resulta de las uniones externas de Transact-SQL heredadas. * De [SQL 2000 BOL: Uso de combinaciones externas] (http://msdn.microsoft.com /en-us/library/aa213228(v=sql.80).aspx). Las versiones más nuevas de ese tema ni siquiera mencionan uniones '* =' y '= *'. –

+1

También (gracias @MikaelEriksson): * Se desaconseja usar esta sintaxis para las combinaciones externas debido a la posibilidad de interpretación ambigua y porque no es estándar. En su lugar, especifique combinaciones en la cláusula FROM. * De [SQL 2000 BOL: SELECT] (http://msdn.microsoft.com/en-us/library/aa259187 (v ​​= sql.80) .aspx). –

0

Esa es la sintaxis más antigua ANSI (ANSI-89) Unión externa izquierda del operador. Recomiendo no usarlo: la sintaxis de ANSI es más detallada y mucho más legible.

+1

Es no estándar y por lo tanto no depricated ANSI;) –

+0

esos son ANSI-89, no es el más reciente de ANSI-92 –

1

Creo que son "operadores de combinación externa no ANSI". El nivel de compatibilidad de su base de datos debe ser 80 o menor.

+1

Hay ANSI, simplemente ANSI-89 en lugar de ANSI-92. También son MALVADOS. –

10

Es una combinación externa izquierda, = * es una combinación externa derecha.

E.g. los siguientes son iguales;

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

    SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID 
+0

En realidad, no siempre son iguales. En una consulta simple como esta, probablemente, en una consulta más compleja, hay un buen momento para que la base de datos lo interprete como una combinación cruzada en lugar de una combinación izquierda. Incluso el SQL Server 2000 BOL habla sobre este tema. No hay ninguna circunstancia en la que sea apropiado utilizar la sintaxis de unión izquierda implícita en el servidor SQL, a menos que esté utilizando una versión tan temprana que la sintaxis explícita no sea compatible. – HLGEM

6

La sintaxis no ANSI para uniones externas (*= y =*) se encuentra en el list of deprecated features that will be removed in the next version of SQL oficial.

Los siguientes datos de SQL Server características del motor no será compatible en la próxima versión de SQL Server. No use estas funciones en el nuevo trabajo de desarrollo y modifique las aplicaciones que actualmente utilizan estas características tan pronto como sea posible.

La función de reemplazo es ANSI compliant syntax of JOIN.

+0

@ spencer7593 Creo que estás equivocado. '* =' y '= *' era sintaxis propia, nunca en ningún estándar ANSI/ISO. –