2009-11-30 79 views
0

我想寫一個基於表的函數,所以它根據值返回不同的結果。基於TSQL表的函數返回不同的表

我:

CREATE FUNCTION [dbo].[tblfn_GetAnyDataSet_As_View] 
(@DataType as varchar(50)) 
returns table as 
return 
select * from 
(select * from table1 UNION select * from table2) DATA 
where [email protected] 

,我想將它升級到的東西simular:

CREATE FUNCTION [dbo].[tblfn_GetAnyDataSet_As_View] 
(@DataType as varchar(50)) 
returns table as 
return 
Case @DataSet 
when 'D1' then select * from table1 
when 'D2' then select * from table2 
else select 'Not Selected' 
end 

但情況表函數不支持。我需要將它保留爲表函數,因爲我有其他表函數,它們彼此構建以創建供SQL報表服務使用的最終視圖。

任何人都可以幫助我嗎?

回答

2

您必須創建一個基於多語句表格的函數。 他們作爲標準表函數工作,但很像存儲過程。

但是,請注意,使用多語句函數可能會損失性能。

0

試試這個:

IF @DataSet = 'D1' BEGIN SELECT ... END 
ELSE BEGIN SELECT ... END 
0

我需要這個太...

多語句基於表的功能的解決方案是好的,但還不夠:

CREATE FUNCTION myProc (@ID Int) 
    RETURNS @EmployeeList Table 
    ( ID  Int 
     , Name nVarChar(50) 
     , Salary Money 
    ) 
AS 
    BEGIN 
    IF @ID IS NULL 
     BEGIN 
     INSERT INTO @EmployeeList (ID, Name, Salary) 
     SELECT ID, Name, Salary 
     FROM Employee 
     END 
    ELSE 
     BEGIN 
     INSERT INTO @EmployeeList (ID, Name, Salary) 
     SELECT ID, Name, Salary 
     FROM Employee 
     WHERE ID = @ID 
     END 
    RETURN 
    END 
GO 

一絕定義返回表 ,以便必須返回預定義的字段 而不是任何表l ike

if @tableNum=1 
then select * from tableA --(tableA and tableB are completely differnt) 
else 
select * from tableB