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