TSQL - El error identificador de delimitación de varias partes

votos
40
CREATE FUNCTION [dbo].[Test] (@ID INT, @VAL INT)
RETURNS @Return TABLE (ID INT, VAL INT)
AS
BEGIN
    INSERT IGNORE  INTO @Return
    SELECT @ID, @VAL
RETURN;
END
GO
DECLARE @T1 TABLE (ID INT IDENTITY(1,1), VAL INT)
DECLARE @T2 TABLE (ID INT, VAL INT)

INSERT IGNORE  INTO @T1
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL 
SELECT 4

INSERT IGNORE  INTO @T2
SELECT 1,1
UNION
SELECT 2,4
UNION
SELECT 3,3

SELECT  *
FROM    @T1 T1
LEFT JOIN @T2 T2 ON T1.[ID] = T2.[ID]
LEFT JOIN [dbo].[Test] (1, COALESCE(T2.[VAL],T1.VAL)) T ON T1.ID = T.ID
GO

DROP FUNCTION [dbo].[Test]
GO

Gol:

Pasar en la T2.Val en el segundo parámetro de la fx si está disponible, de lo contrario pasar T1.Val. Cambiar la definición de FX no es posible.

Me parece que no puede conseguir este trabajo. Probé ISNULL y que no funciona bien.

Publicado el 14/04/2017 a las 12:18
por usuario
En otros idiomas...                            


1 respuestas

votos
3

Si desea llamar a una función con valores de tabla, utilice APPLY( OUTER APPLYen este caso, porque está utilizando LEFT JOIN):

SELECT  *
FROM @T1 T1 LEFT JOIN
     @T2 T2 
     ON T1.[ID] = T2.[ID] OUTER APPLY
     [dbo].[Test](1, COALESCE(T2.[VAL], T1.VAL) ) T;

Si quieres una condición adicional, a continuación, utilizar una WHEREcláusula:

SELECT  *
FROM @T1 T1 LEFT JOIN
     @T2 T2 
     ON T1.[ID] = T2.[ID] OUTER APPLY
     [dbo].[Test](1, COALESCE(T2.[VAL], T1.VAL) ) T
WHERE t1.ID = T.ID;

Esa última condición parece extraño, sin embargo. ¿Por qué no sólo tiene que pasar T1.IDa la función directamente?

Respondida el 14/04/2017 a las 12:20
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more