如何使函数以用户定义的表类型作为参数,并在sql中返回相同的值?
实际上,我已经在SQLServer2008中创建了一个用户定义的表类型。结构如下所示 我将它作为参数传递到函数中,该函数还返回该类型的表类型。当我在函数中声明该类型的变量时,我面临着这个问题,在其中插入一些数据并返回该参数 表类型结构为:如何使函数以用户定义的表类型作为参数,并在sql中返回相同的值?,sql,sql-server,sql-server-2008,function,user-defined-types,Sql,Sql Server,Sql Server 2008,Function,User Defined Types,实际上,我已经在SQLServer2008中创建了一个用户定义的表类型。结构如下所示 我将它作为参数传递到函数中,该函数还返回该类型的表类型。当我在函数中声明该类型的变量时,我面临着这个问题,在其中插入一些数据并返回该参数 表类型结构为: Create Type OfferWithSubscription as Table (
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
您只需按如下方式展开类型。
供参考- 为了进一步澄清,这是完全兼容的,并且可分配给该表类型的变量,例如
Mahmoud Gamal先生,它显示了“必须声明标量变量“@ReturnTable”的错误。“您是否错过了函数头中的
RETURNS@ReturnTable
行?Richard先生,您能告诉我如何执行此函数并测试它吗?”?我试过了,exec dbo.FN_ShowOffer(@G,@S,@B,@TestTable),但它显示了错误…..单击答案中的第二个“SQL Fiddle”链接。。。在SSMS中运行左侧内容,然后在另一个窗口中运行右侧内容。您不执行表函数,而是从中选择。我不明白-您将@t定义为通过提供@t调用fn_showoffer的图像?这是递归吗?
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
declare @t OfferWithSubscription
insert @t
select * from fn_showoffer(1,2,3,@t)