equal - sql comparison operators
SQL Server*= ¿Operador? (6)
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 ello en MSDN . La consulta ejecuta y devuelve datos. Por lo que nadie sabe, esto ha estado en el sistema desde que usaban SQL Server 2000, pero ahora están ejecutando 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
Creo que esos son "operadores de unión externa no ANSI". El nivel de compatibilidad de su base de datos debe ser 80 o inferior.
Elimine este código inmediatamente y sustitúyalo por una unión 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 ajustarse a las combinaciones de la izquierda, también debe eliminar todas esas otras combinaciones implícitas. La sintaxis de unión implícita ha sido obsoleta desde 1992, no hay excusa para que aún esté en el código de producción. Y la mezcla de combinaciones implícitas y explícitas puede dar resultados inesperados.
Es una combinación externa izquierda, = * es una combinación externa derecha.
Por ejemplo, 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
Es una sintaxis unida a taquigrafía. Echa un vistazo a este hilo que cubre este tema.
Esa es la antigua sintaxis ANSI (ANSI-89) del operador de unión externa izquierda. Recomiendo no usarla: la sintaxis ANSI es más detallada y es mucho más legible.
La sintaxis no ANSI para las combinaciones externas ( *=
y =*
) se encuentra en la lista oficial de características en desuso que se eliminarán en la próxima versión de SQL .
Las siguientes funciones del Motor de base de datos de SQL Server no serán compatibles en la próxima versión de SQL Server. No use estas características en el nuevo trabajo de desarrollo, y modifique las aplicaciones que actualmente usan estas características tan pronto como sea posible.
La característica de reemplazo es la sintaxis compatible con ANSI de JOIN .