TSQL - De meerdelige id begrenzende fout

stemmen
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

Doel:

Om te slagen in T2.Val in de 2e param van de fx indien beschikbaar, anders pas in T1.Val. Veranderen van de FX definitie niet mogelijk is.

Ik kan niet schijnen om dit werk te krijgen. Ik probeerde ISNULL en dat werkt ook niet.

De vraag is gesteld op 14/04/2017 om 15:18
user
In andere talen...                            


1 antwoorden

stemmen
3

Als u wilt een tabelwaardefunctie belt, gebruikt APPLY( OUTER APPLYin dit geval, want je gebruikt 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;

Als u een extra voorwaarde wilt, dan gebruik maken van een WHEREclausule:

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;

Die laatste voorwaarde lijkt vreemd, dat wel. Waarom niet gewoon overgaan T1.IDin de functie direct?

antwoordde op 14/04/2017 om 15:20
bron van user

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