2010-11-18 11 views
7

私はsql関数を持っており、その関数にはいくつかの変数を宣言する必要があります。私はこれをどのように達成することができるかアドバイスしてください。 >sql関数の変数を宣言する

Declare @ClientResult TABLE(
     RowIndex int identity(1,1), 
     SplitText varchar(50) 
    ) 

を、以下の機能に -

は、例えば、私は配置する必要があります。

create FUNCTION [dbo].CLIENT_SHIPPINGREPORTDATA_Function_Test 
(     
@CLIENTPK_NEW TABLE, 
@CGNEEPK TABLE 
@type varchar(100)    
)     
RETURNS TABLE      
AS    

RETURN     

SELECT distinct    
OP_PartNum,    
OP_PK  
FROM Client_whsPallet pallet     

私は何を後にしていることは、例えば

複数文のテーブル機能であるSQL Server 2005の

おかげ

答えて

6

を使用しています

CREATE FUNCTION dbo.fxnExample (@Param INTEGER) 
RETURNS @Results TABLE(FieldA VARCHAR(50)) 
AS 
BEGIN 
INSERT @Results 
SELECT SomeField 
FROM Somewhere 
WHERE ParamField = @Param 

RETURN 
END 

これは、「インラインテーブル値関数」と呼ばれ、あなたが複数文のアプローチに切り替えた場合、これはパフォーマンスの問題を引き起こす可能性があるとして、あなたは違いを認識しておく必要があり、あなたの現在の機能とは異なっています。可能であれば、インラインテーブル値関数を試してみることが私のアドバイスです。あなたは、インラインテーブル値関数の内部変数を宣言することはできませんSQL Serverで

Multi-statement Table Valued Function vs Inline Table Valued Function
http://blogs.msdn.com/b/psssql/archive/2010/10/28/query-performance-and-multi-statement-table-valued-functions.aspx
http://sqlbits.com/Agenda/event6/High_performance_functions/default.aspx

+0

返されたテーブルの値が実際に動的な列に基づくピボットテーブルの場合はどうなりますか?実際になぜ私がテーブル関数を使用しているのか:/ –

5

:私はあなたが詳細に入るこれらの記事をチェックアウトをお勧めします。実際に変数を宣言する必要がある場合は、複数ステートメントのテーブル値関数を作成する必要があります。

CREATE FUNCTION [dbo].CLIENT_SHIPPINGREPORTDATA_Function_Test 
(
    @CLIENTPK_NEW TABLE, @CGNEEPK TABLE @type varchar(100) 
) 
RETURNS @output TABLE (OP_PartNum int, OP_PK int) 
AS BEGIN 

Declare @ClientResult TABLE(RowIndex int identity(1,1), SplitText varchar(50)) 

/* more code here */ 

RETURN 
END 

あなたはパフォーマンスの低下を見るようにかかわらず、複数文の機能を使用して周りを離れている場合、私は見ることがまさにそれはあなたがやろうとしているで、知らない:あなたはこのような何かをするだろう。

0

AdaTheDevで示唆されているように、関数からテーブルを返すためのマルチステートメント関数を作成できます。
あなたが関数の内部テーブルを作成する必要がある場合はそれ以外の場合は、あなたが#

create table #TableNAme (FieldA Varchar(5)) 
3

でその名を前に付ける新しい一時テーブルを作成することができますが、これらの同等のコードサンプルを比較してください。インラインとマルチステートメントのテーブル値関数の構文の違いを示しています。

CREATE FUNCTION [dbo].Inline (@type varchar(100)) 
RETURNS TABLE 
AS 
RETURN 
    SELECT distinct name 
    FROM sysobjects 
    WHERE type = @type 
GO 

CREATE FUNCTION [dbo].Multistatement (@type varchar(100)) 
RETURNS @results TABLE (name sysname) 
AS 
BEGIN 
    INSERT @results (name) 
    SELECT distinct name 
    FROM sysobjects 
    WHERE type = @type 

    RETURN 
END