代码之家  ›  专栏  ›  技术社区  ›  Amit

在sql函数中声明变量

  •  7
  • Amit  · 技术社区  · 14 年前

    我有一个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 回复  |  直到 14 年前
        1
  •  6
  •   Community CDub    7 年前

    您需要的是一个多语句表函数

    例如

    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

        2
  •  5
  •   Justin Swartsel    14 年前

    在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
    

    不知道你到底想做什么,我会看看是否有使用多语句函数,虽然你会看到性能下降。

        3
  •  3
  •   Anthony Faull    14 年前

    比较这些等价的代码示例。它们显示了内联和多语句表值函数之间的语法差异。

    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
    
        4
  •  0
  •   Ghidello    14 年前

    根据AdaTheDev的建议,您可以创建一个多语句函数,用于从函数返回表。
    否则,如果需要在函数中创建表,则可以创建一个新的临时表,用一个

    create table #TableNAme (FieldA Varchar(5))