在SQL函数中声明变量

7

我有一个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。

谢谢。

4个回答

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

这与您当前使用的“内联表值函数”不同,您应该意识到这些差异,因为如果您切换到多语句方法,可能会导致性能问题。我的建议是尽可能使用内联表值函数。我建议您查看以下详细文章:
多语句表值函数与内联表值函数
链接
http://sqlbits.com/Agenda/event6/High_performance_functions/default.aspx

如果我的返回表的值实际上是基于动态列的数据透视表,那该怎么办?这就是我使用表函数的原因... :/ - Simon Dugré

6

在 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

不知道你具体想做什么,但我建议尽量避免使用多语句函数以提高性能。


5

对比以下等效的代码样例。它们展示了内联和多语句表值函数之间的语法差异。

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

0
如AdaTheDev所建议的,您可以创建一个多语句函数来从函数返回表格。
否则,如果您需要在函数内创建一个表格,您可以创建一个新的临时表格,并在其名称前加上“#”前缀。
create table #TableNAme (FieldA Varchar(5))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接