2010-11-18 124 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 

這是你被稱爲「內聯表值函數」,你應該知道的區別,因爲這可能導致性能問題,如果切換到多語句的方法當前的功能不同。我的建議是嘗試儘可能使用內聯表值函數。我建議你檢查出這些文章這細講:

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

如果我返回的表的值實際上是基於動態列的數據透視表,該怎麼辦?這就是爲什麼我使用表函數...:/ – 2015-02-25 19:57:08

5

在SQL Server中你不能內嵌表值函數內聲明的變量。如果您確實需要在其中聲明變量,則需要創建一個多語句表值函數。你會做這樣的事情:

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