TSQL - Η πολυ-τμήμα σφάλματος αναγνωριστικό οριοθέτησης

ψήφοι
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

Στόχος:

Για να περάσει στην T2.Val στο 2ο param του fx, αν υπάρχει, αλλιώς να περάσει στην T1.Val. Η αλλαγή του ορισμού FX δεν είναι δυνατή.

Δεν μπορώ να φαίνεται για να πάρει το έργο αυτό. Προσπάθησα IsNull και ότι δεν λειτουργεί ούτε.

Δημοσιεύθηκε 14/04/2017 στις 15:18
χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
3

Αν θέλετε να καλέσετε μια συνάρτηση πίνακα αξίας, χρησιμοποιήστε APPLY( OUTER APPLYσε αυτή την περίπτωση επειδή χρησιμοποιείτε 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;

Αν θέλετε μια πρόσθετη προϋπόθεση, στη συνέχεια, χρησιμοποιήστε μια WHEREρήτρα:

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;

Η τελευταία αυτή προϋπόθεση φαίνεται παράξενο, όμως. Γιατί όχι μόνο να περάσει T1.IDστη λειτουργία άμεσα;

Απαντήθηκε 14/04/2017 στις 15:20
πηγή χρήστη

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