2011-09-15 6 views
0

レッツに基づいて、異なる同義語から行をフェッチし、テーブルを返す関数を作成したいが、私は3つの同義語私は@parameter

  • snTable1
  • snTable2
  • snTable3

を持っていると言います渡されたパラメータに基づいて行をフェッチする関数を作成します。

fxFromTable (@FromDate, @ToDate, 'snTable1') 
    will return table from "Select * from snTable1 (@FromDate, @ToDate)" 

または

fxFromTable (@FromDate, @ToDate, 'snTable2') 
    will return table from "Select * from snTable2 (@FromDate, @ToDate)" 

または

fxFromTable (@FromDate, @ToDate, 'snTable3') 
    will return table from "Select * from snTable3 (@FromDate, @ToDate)" 

私は、これは、動的SQLを実行して行うことができると思いますできるだけ早く

答えて

0

を助けてください。しかし、関数内では使用できません。したがって、この場合はストアドプロシージャを使用できます。これは以下のようにすることができます。

CREATE PROCEDURE TEST 
    (
     @TableName VARCHAR(50), 
     @FromDate DATETIME, 
     @ToDate DATETIME 
) 
    AS 
    BEGIN 
     EXEC('SELECT * FROM ' + @TableName + ' WHERE FromDate = '''+ @FromDate + ''' AND ToDate = ''' + @ToDate + ''') 
    END 

あなたが他のストアドプロシージャでこれを使用する場合は、以下のような何かを行うことができます:

INSERT @temp EXECUTE TEST 

、@tempは通常の一時テーブルとして使用することができます。

これが役立ちますように!

0

UNION ALLを使用してインラインTVFを作成できます。最後のパラメータは、ソースタイプ(1 = Sales.SalesOrderHeader、2 = Sales.SpecialOffer、3 = HumanResources.Employee)を表します。

CREATE FUNCTION dbo.GetData(@From DATETIME, @To DATETIME, @Source TINYINT) 
RETURNS TABLE 
AS 
RETURN 
SELECT @Source AS [Source], soh.SalesOrderID BusinessObjectID, soh.OrderDate AS [Date], soh.SalesOrderNumber AS [Descriptor] 
FROM Sales.SalesOrderHeader soh 
WHERE @Source = 1 
AND  soh.OrderDate BETWEEN @From AND @To 
UNION ALL 
SELECT @Source , so.SpecialOfferID, so.StartDate, so.[Description] 
FROM Sales.SpecialOffer so 
WHERE @Source = 2 
AND  so.StartDate >= @From 
AND  so.EndDate <= @To 
UNION ALL 
SELECT @Source , e.BusinessEntityID, e.HireDate, e.NationalIDNumber 
FROM HumanResources.Employee e 
WHERE @Source = 3 
AND  e.HireDate BETWEEN @From AND @To; 
GO 

使用法:

SELECT * 
FROM dbo.GetData('20030101', '20031231', 3); 

あなたが実行計画を見ればあなたが素敵な何かが表示されます。代わりに3つのSELECT文を実行すると、SQL Serverは、唯一のSELECT文を実行しますが、この場合にのみ、最後のSELECT:

StmtText 
    |--Compute Scalar(DEFINE:([Union1007]=[AdventureWorks2008].[HumanResources].[Employee].[BusinessEntityID] as [e].[BusinessEntityID], [Union1008]=CONVERT_IMPLICIT(datetime,[AdventureWorks2008].[HumanResources].[Employee].[HireDate] as [e].[HireDate],0), [Union1009]=[AdventureWorks2008].[HumanResources].[Employee].[NationalIDNumber] as [e].[NationalIDNumber])) 
     |--Clustered Index Scan(OBJECT:([AdventureWorks2008].[HumanResources].[Employee].[PK_Employee_BusinessEntityID] AS [e]), WHERE:([AdventureWorks2008].[HumanResources].[Employee].[HireDate] as [e].[HireDate]>='2003-01-01 00:00:00.000' AND [AdventureWorks2008].[HumanResources].[Employee].[HireDate] as [e].[HireDate]<='2003-12-31 00:00:00.000')) 

この例では、AdventureWorks2008データベースに基づいています。