2017-04-14 43 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 - 多部分標識符邊界錯誤

要通過在T2.Val入FX如果可用的第二PARAM,否則傳遞T1.Val。改變FX定義是不可能的。

我似乎無法得到這項工作。我嘗試過ISNULL,那也不管用。

回答

3

如果你想要把一個表值函數,(在這種情況下OUTER APPLY,因爲你正在使用LEFT JOIN)使用APPLY

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直接進入函數?

+0

這工程!謝謝,原因是,真正的FX有更多的參數,所以我試圖用上面的示例代碼模仿基本的東西。再次感謝,在時限到期時將標記爲答案。 – 007

相關問題