【问题标题】:declare variable in a sql function在sql函数中声明变量
【发布时间】:2011-05-12 00:46:13
【问题描述】:

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

谢谢

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      按照 AdaTheDev 的建议,您可以创建一个多语句函数,用于从函数返回表。
      否则,如果您需要在函数内创建一个表,您可以创建一个新的临时表,并在其名称前加上 #

      create table #TableNAme (FieldA Varchar(5))
      

      【讨论】:

        【解决方案3】:

        在 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
        

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

        【讨论】:

          【解决方案4】:

          你追求的是一个多语句表函数

          例如

          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

          【讨论】:

          • 如果我返回的表的值实际上是基于动态列的数据透视表怎么办?这就是我使用表函数的原因...:/
          猜你喜欢
          • 2012-12-26
          • 1970-01-01
          • 2021-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-03
          相关资源
          最近更新 更多