2017-04-14 16 views
1
CREATE FUNCTION [dbo].[Test] (@ID INT, @VAL INT) 
RETURNS @Return TABLE (ID INT, VAL INT) 
AS 
BEGIN 
    INSERT 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 INTO @T1 
SELECT 1 
UNION ALL 
SELECT 2 
UNION ALL 
SELECT 3 
UNION ALL 
SELECT 4 

INSERT 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 

目標:TSQL - マルチパート識別子境界エラー

は他に、利用可能な場合、FXの第二のparamにT2.Valに渡しT1.Valに渡します。 FX定義を変更することはできません。

私はこの作品を手に入れることはできません。私はISNULLを試しましたが、どちらもうまくいきません。あなたは、テーブル値関数を呼び出したい場合は(あなたがLEFT JOINを使用しているため、この場合にはOUTER APPLY

答えて

3

APPLYを使用します。

:あなたは追加の条件が必要な場合は、 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; 

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を渡すだけではないのですか?

+0

これは機能します!ありがとうと理由は、実際のFXは、より多くのparamsを持っているので、私は上記のサンプルコードで基本的なものを模倣しようとしました。もう一度おねがいします。期限が切れたときに回答としてマークします。 – 007

関連する問題