如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?

Posted

技术标签:

【中文标题】如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?【英文标题】:How to make a function that take user defined table type as parameter and return same in sql? 【发布时间】:2012-09-26 11:17:23 【问题描述】:

其实我已经在sql server 2008中创建了一个用户定义的表类型。结构如下。

我在函数中将它作为参数传递,并且该函数也返回该类型的表类型。我正面临这个问题,而我在函数中声明了该类型的变量,在其中插入了一些数据并返回了该参数。

表类型结构为:

Create Type OfferWithSubscription  as  Table                                        
   (                                        
     OfferID int, 
     OfferUserID  int,                                    
     OfferImage  varchar(200),                          
     OfferExactPrice Decimal(18,2),                                
     OfferContent varchar(max),
     OfferTitle varchar(100),                                    
     StartDate datetime,                                    
     EndDate datetime,                                    
     StartTime datetime,                                    
     StopTime datetime,                            
     ShowToUser bit,    
     SubID  int,                    
     SubLevel varchar(100)
   )

我要创建的功能是:

CREATE FUNCTION FN_ShowOffer
(   
    @Gold int,
    @Silver int,
    @Bronze int,
    @table dbo.OfferWithSubscription Readonly )
RETURNS dbo.OfferWithSubscription 
AS
BEGIN

DECLARE @ReturnTable AS dbo.OfferWithSubscription;
Declare @Case as varchar(20)
         if(@Gold=0 and @Silver=1 and @Bronze=0 )
            begin
            set @Case='1S'
            end
           if(@Case='1S')
           Begin
                   insert into @ReturnTable                                    
                   select OfferID, OfferUserID, OfferImage, 
                     OfferExactPrice, OfferContent,
                     OfferTitle, StartDate, EndDate, 
                     StartTime, StopTime, ShowToUser,
                     SubID, SubLevel
                   from @table
                   where SubID=4 
           End

RETURN (

@ReturnTable
)
END

【问题讨论】:

【参考方案1】:

您只需像下面那样扩展类型。 仅供参考 - Can T-SQL function return user-defined table type?

CREATE FUNCTION FN_ShowOffer
(   
    @Gold int,
    @Silver int,
    @Bronze int,
    @table dbo.OfferWithSubscription Readonly )
RETURNS @ReturnTable Table                                        
   (                                        
     OfferID int, 
     OfferUserID  int,                                    
     OfferImage  varchar(200),                          
     OfferExactPrice Decimal(18,2),                                
     OfferContent varchar(max),
     OfferTitle varchar(100),                                    
     StartDate datetime,                                    
     EndDate datetime,                                    
     StartTime datetime,                                    
     StopTime datetime,                            
     ShowToUser bit,    
     SubID  int,                    
     SubLevel varchar(100)
   )
AS
BEGIN
Declare @Case as varchar(20)
         if(@Gold=0 and @Silver=1 and @Bronze=0 )
            begin
            set @Case='1S'
            end
           if(@Case='1S')
           Begin
           insert into @ReturnTable                                    
             select OfferID,OfferUserID,OfferImage,OfferExactPrice,OfferContent,OfferTitle,
             StartDate,EndDate,StartTime,StopTime,ShowToUser,SubID,SubLevel from @table where SubID=4 
           End

RETURN
END

为了进一步澄清,这完全兼容并可分配给该表类型的变量,例如SQL Fiddle

declare @t OfferWithSubscription
insert @t
select * from fn_showoffer(1,2,3,@t)

【讨论】:

先生。 Mahmoud Gamal,它显示错误“必须声明标量变量“@ReturnTable”。” 你错过了函数头中的RETURNS @ReturnTable Table这一行吗? 先生。理查德,你能告诉我如何执行这个功能并测试它吗?我喜欢它,exec dbo.FN_ShowOffer(@G,@S,@B,@TestTable) 但它显示错误..... 单击答案中的第二个“SQL Fiddle”链接...在 SSMS 中运行左侧内容,然后在另一个窗口中运行右侧内容。你不执行表函数,你 SELECT 从他们那里。 我不明白 - 您通过提供 @t? 将 @t 定义为调用 fn_showoffer 的图像?这是递归吗?

以上是关于如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server,如何从用户定义的表类型中删除更新元素?

用户定义的表类型是否拒绝EXECUTE权限?

如何在SQL Server中使用用户定义的表类型插入数据时避免重复记录

用户定义的表类型参数

SQL Server 2008 - UDF 参数类型和返回类型

在 SQL Server Management Studio 中使用执行过程 - 如何格式化用户定义的表类型的值?