2016-01-23 47 views
3

這裏是我用來創建一個功能,它接受table作爲輸入,並且操作後的函數返回內的代碼導致table格式爲:如何在T-SQL中編寫函數,該函數接受一個表作爲輸入並將結果返回爲表?

CREATE FUNCTION fn_CalculateListing(@Listing ListingColumn READONLY) --(ROWID INT,value1 INT, value2 INT)) 
RETURNS TABLE 
AS 
BEGIN 
    DECLARE @result TABLE (ID INT, Name VARCHAR(50)) 

    INSERT INTO @result(ID,Name) 
     SELECT ROWID, Name 
     FROM @Listing 

    RETURN @Listing 
END 

我試圖用table-inline parameter但收到以下錯誤:

Msg 137, Level 15, State 2, Procedure fn_CalculateListing, Line 16
Must declare the scalar variable "@Listring".

Msg 102, Level 15, State 31, Procedure fn_CalculateListing, Line 29
Incorrect syntax near 'BEGIN'.`

我該如何使它正確?

+0

首先,您必須爲輸入聲明一個TYPE。其次,您正在混合兩種創建功能的風格。一個是BEGIN和END,它需要一個詳細的表格聲明,另一個是在'AS'後面緊跟'RETURN SELECT ...'。第一種是「多語句TVF」,如果有可能,你應該**避免**;第二種是可以的(臨時的)TVF,它非常棒!** – Shnugo

回答

3

也許指定dbo模式很重要。我還定義了@result表,它與你的代碼有點不同。

我已經簽了下面的腳本作品:

創建表類型

CREATE TYPE [dbo].[ListingColumn] AS TABLE(
    [ROWID] [int] NULL, 
    [value1] [int] NULL, 
    [value2] [int] NULL 
) 
GO 

創建表值函數

CREATE FUNCTION [dbo].[fn_CalculateListing](@Listing dbo.ListingColumn READONLY) 
RETURNS @result TABLE 
(
    ID INT, 
    Name VARCHAR(50) 
) 
AS 
BEGIN 
    INSERT INTO @result(ID, Name) 
    SELECT ROWID, value1 
    FROM @Listing; 

    RETURN; 
END 
GO 

如果你的函數可以表示作爲一個單一的SELECT,把它寫成罪是好多了gle-statement內聯用戶定義函數。語法如下所示:

CREATE FUNCTION [dbo].[InlineCalculateListing](@Listing dbo.ListingColumn READONLY) 
RETURNS TABLE 
AS 
RETURN 
(
    SELECT ROWID, value1 
    FROM @Listing AS L 
); 
GO 
+1

你應該絕對* *避免使用多語句TVF!只需編寫'RETURNS TABLE'並且(不用BEGIN和END!)繼續使用'AS RETURN SELECT ...',這樣TVF就會成爲真正的臨時SQL,並且完全可以被內聯和**多**性能更好!它會自動識別它的列。它是 - 技術上講 - 一個參數化的VIEW ... – Shnugo

+0

TVF的這種味道(帶有BEGIN和END)允許你編寫很多步驟,聲明變量,無論...這個價格是**非常差的表現**!有非常罕見的情況下,這樣一個TVF將是正確的選擇...... – Shnugo

+1

@Shnugo,我添加了第二個變體,內嵌正確的語法UDF。你說得對,如果有可能做內聯UDF,你應該這樣做。如果沒有,它是pos sible具有多語句功能,但其性能通常會更差。 –

相關問題