2015-10-11 1 views
1

Нужна помощь с созданной мной SQL user_defined функцией. Моя функция должна возвращать тип элемента на основе номера элемента, который я даю. Когда я выполняю функции я получаю ошибкукак вернуть несколько значений из пользовательской функции в SQL

«Subquery вернулся более чем 1 значение. Это не допускается, когда подзапрос следующим образом: =,! =, <, < =,>,> = или когда Подзапрос используется как выражение . "

Я думаю, что я должен изменить этот тип возвращаемых функций на таблицу. Однако я не знаю, как это сделать. Здесь моя функция:

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

Это сработало для меня! Благодаря

создать процедурный [DBO]. [Тип] @item VARCHAR (10) AS начинают DECLARE @type VARCHAR (10) , @ typeCount INT
, @ MaxYear INT , @ redoitem VARCHAR (18)

набор @type = '' множество @typeCount = (SELECT COUNT (DISTINCT m.year) от мр м где m.item_no = @item) - @ п

множества @MaxYear = (Выберите distinc т Макс (m.year) от г-м где m.item_no = @item)

множество @redoitem = (выберите верхний 1 redoitem от г-м где m.item_no = @item)

IF (@redoitem является нулевым или @ redoitem = '') НАЧАТЬ
WHILE (@typeCount> = 1) НАЧАТЬ

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

Else НАЧАТЬ While (@typeCount> = 1) Начало

Если @typeCount = 1 Begin множество @type = 'N' UPDATE типа SET = Mr @ типа WHERE = @item Номер элемента И год = @MaxYear End 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