2015-10-11 56 views
1

需要我创建的SQL user_defined函数的帮助。 我的函数应该根据我给的项目编号返回项目的类型。 当我执行的功能我得到一个错误如何从SQL中的用户定义函数返回多个值

“子查询返回多个值,这是不允许的 当子查询跟随=,!=,<,< =,>,> =或当子查询用作 的表达式。“

我想我应该将此函数返回类型更改为表。但是我不知道该怎么做。 这里是我的功能:

create function [dbo].[fx_calculate_type](@item varchar) 
returns varchar(10) 
AS 
begin 
DECLARE @type VARCHAR(10) 
     ,@typeCount int 
     ,@MaxYear int 
     ,@redoitem varchar(18) 

set @type = '' 
set @typeCount = (Select count(m.year) 
        from mr m 
        where m.item_no = 'RR301') [email protected] 
set @MaxYear = (Select Max(m.year) 
        from mr m 
        where m.item_no = 'RR301') [email protected] 
set @redoitem = (select redoitem 
        from mr m 
        where m.item_no = 'RR301') [email protected] 

     if (@redoitem is null or @redoitem= '') 

     BEGIN 
     While (@typeCount>=1) 
     Begin 
     Continue 
      If @typeCount = 1 
       Begin 
       set @type = 'N' 
        --return (@type) 
       End 
      Else 
       Begin 
       set @type = @typeCount+ 'C' 
       set @MaxYear [email protected] -1 --2014 
       set @typeCount = @typeCount -1 --4 
        -- return (@type) 
       END 
      END 
     END 

     Else 
      BEGIN 
     While (@typeCount>=1) 
     Begin 
     Continue 
      If @typeCount = 1 
       Begin 
       set @type = 'N' 
        --return (@type) 
       End 
      Else 
       Begin 
       set @type = @typeCount+ 'R' 
       set @MaxYear [email protected] -1 --2014 
       set @typeCount = @typeCount -1 --4 
        --return (@type) 
       END 
      END 
     END 
    return (@type) 
     END 

我怎样才能使它发挥作用?

+1

你的代码看起来太复杂了你给的描述。但是第三个带有子查询的'set'会导致你描述的错误。 –

+1

您的循环看起来像您需要有一个表值函数,这是一个标量函数,请参阅https://msdn.microsoft.com/en-us/library/ms186755.aspx –

+0

您需要一个多语句表值函数并从该函数返回一个表或使用具有多个OUTPUT参数(首选)的存储过程。另外你的函数在没有定义任何长度的情况下接受'varchar'类型的参数,传递给这个变量的任何东西都会被截断为默认长度'1'。您需要明确定义此参数的长度。 –

回答

0

这对我有效!感谢

创建PROC [DBO]。[类型] @item VARCHAR(10) AS 开始 DECLARE @type VARCHAR(10) ,@ typeCount INT
,@ MaxYear INT ,@ redoitem VARCHAR( @项

组@MaxYear - 从先生米 其中m.item_no = @item)18)

组@type = '' 组@typeCount =(SELECT COUNT(DISTINCT m.year) =(选择distinc吨MAX(m.year) 从先生米 其中m.item_no = @item)

组@redoitem =(从先生米 其中m.item_no = @item)

选择顶部1 redoitem IF(@redoitem为空或@ redoitem = '')BEGIN
WHILE(@typeCount> = 1)BEGIN

IF @typeCount = 1 
     BEGIN 
    SET @type = 'N'  
    UPDATE mr SET type [email protected] WHERE item_no = @item AND year = @MaxYear  
    END 
    ELSE   
     BEGIN 

     set @type = CONVERT(VARCHAR(10),@typeCount)+ 'C'  
     UPDATE mr SET type [email protected] WHERE item_no = @item AND year = @MaxYear 
     SET @MaxYear [email protected] -1 

    END 

     SET @typeCount = @typeCount -1 
    CONTINUE 
END 

END

否则BEGIN 虽然(@typeCount> = 1)开始

如果@typeCount = 1 开始 组@type = 'N' UPDATE SET先生类型= @类型WHERE ITEM_NO = @item AND年= @MaxYear 结束 Else 开始 set @type = CONVERT(VARCHAR(10),@ typeCount)+'R' UPDATE mr SET type = @ type WHERE item_no = @item AND year = @MaxYear set @MaxYear = @ MaxYear -1 - -2014 set @typeCount = @typeCount -1 - 4

END

CONTINUE 
    END 

END END