2015-02-08 47 views
0

我想構建一個非常複雜的Table_valued函數(TVF),它將返回非固定輸出結構。帶隱式輸出的Table_valued函數

有時TVF可能返回2列,其他時間可能只返回1列。

我無法找到一個方法來做到這一點,因爲數據庫引擎需要明確的輸出表結構爲:

RETURNS @returnTable 
TABLE 
( 
     column1 numeric, 
     column2 numeric 
) 

一旦我找到了上述的解決方案我想這樣做:

SELECT 
* 
INTO #tmp 
FROM MyTVF 

我知道它可能實現的存儲過程,但然後我會面對另一個問題。通過使用存儲過程,我將無法將結果保存到臨時表中,而無需明確聲明輸出。

這裏是我想做些什麼了一槍例如:

CREATE FUNCTION [dbo].myFunction (@type int) 
RETURNS @table TABLE 
( 
    Column1 int, 
    Column2 int 

) 
AS 
BEGIN 


    IF @type=1 
    BEGIN 
     INSERT INTO @table 
     SELECT 1 AS Column1, 2 AS Column2 
    END 
    ELSE 
    BEGIN 
     INSERT INTO @table 
     SELECT 1 AS OnlyOneColumn 
    END 

RETURN 
END 
GO 

SELECT * INTO #tmp1 FROM myFunction(1) 
SELECT * FROM #tmp1 
+0

您可以使用最大列數聲明返回表。然後,在插入時,只消費你感興趣的列的數量。 – 2015-02-08 15:07:03

+0

@GiorgosBetsos,你是否建議總是返回最大列數並使用NULL作爲cenario不相關列的值? – 2015-02-08 15:10:58

+0

是的,使用NULL來填充冗餘列。這只是一個解決方法。 'TVF' AFAIK中不能有易失性返回類型, – 2015-02-08 15:14:52

回答

0

所有表值函數返回一個表具有固定結構。

但是(與多語句表值函數),你不必聲明結構直列表值函數,例如:

CREATE FUNCTION MyFunction(@MyParameter INT) 
RETURNS TABLE AS RETURN 
SELECT * FROM SomeTable 
WHERE [email protected] 

此功能仍然會返回固定數量的列:即使稍後向SomeTable添加列,它們也不會被MyFunction返回,除非函數被修改或刷新(使用​​)。

您不能創建返回可變列數的Table-Valued函數(取決於輸入參數)。

+0

只是試圖做這樣的事情沒有成功: 'ALTER FUNCTION fn_testa(@MyParameter INT) RETURNS TABLE AS BEGIN IF @ MyParameter = 1 BEGIN \t SELECT TOP 10 * FROM MyTable的 END ELSE BEGIN \t SELECT TOP 10 * FROM MyOtherTable END GO SELECT * FROM fn_testa(1)' 能否請你幫忙嗎? – 2015-02-09 08:25:12

+0

內聯表值函數僅適用於單個語句。如果你想使用多個語句,你將有一個多語句表值函數,它要求你聲明返回表的結構。 – 2015-02-11 08:25:58