2011-11-21 57 views
8

我打過電話的在線TVF與位置參數,它工作正常:使用命名參數調用串聯TVF,什麼是正確的語法?

SELECT MyTable.Col1, 
     (SELECT TvfColumn FROM ufnGetData(MyTable.Col1, MyTable.Col2)), 
     MyTable.Col2 
FROM MyTable 

然後我試圖命名參數的TVF,它不解析:

SELECT MyTable.Col1, 
     (SELECT TvfColumn FROM ufnGetData(@Param1=MyTable.Col1, @Param2=MyTable.Col2)), 
     MyTable.Col2 
FROM MyTable 

功能看起來是這樣的:

CREATE FUNCTION dbo.ufnGetData 
( 
    @Param1 INT, 
    @Param2 INT 
) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT 
     blah blah blah AS TvfColumn 
) 
GO 

給了一個錯誤類似於:

消息137,級別15,狀態2,行23必須聲明標量變量 「@Param2」。

消息102,級別15,狀態1,行24''附近語法不正確。

我在做什麼錯?

回答

7

表值用戶定義函數不能像存儲過程一樣對待。您在調用它們時不使用命名參數,它是基於位置的。換句話說,你試圖做的事是不可能的。

是否有你想使用命名參數的原因?你需要定義所有的參數,所以你通常在存儲過程中看不到真正的好處。

+7

真正的好處是我可以在不影響呼叫者的情況下更改TVF中的參數順序。看到參數是什麼,如果它們被命名也很容易,儘管我可以通過良好的內聯註釋獲得相同的效果。 –

+0

@MichaelGoldshteyn對不起,SQL Server不可能。 – 2011-11-21 22:15:35

+4

RE:「或任何功能」。這不是真的。在這種情況下,可以使用'EXEC'調用標量UDF並接受命名參數。 –

相關問題