Не бих използвал скаларна функция за този тип операция. В крайна сметка получавате лоша производителност, защото оптимизаторът на заявки трябва да го изпълнява ред по ред
без никаква оптимизация. Повече информация: Функции на SQL Server:Основите
.
Второ с float/decimal и LOG/EXP
ще получите грешки в приближението.
Трето, за предаване на данни към функция можете да използвате XML
като:
CREATE FUNCTION dbo.udf_Mul(@value xml)ВРЪЩА FLOATAS BEGIN DECLARE @mul_value FLOAT; DECLARE @values AS TABLE ([стойност] float); INSERT INTO @values([стойност]) SELECT [стойност] =t.c.value('(стойност)[1]', 'float') FROM @value.nodes('//ред') AS t(c); SELECT @mul_value=CASE WHEN MinVal =0 THEN 0 WHEN Neg % 2 =1 THEN -1 * Exp(ABSMult) ELSE Exp(ABSMult) END FROM (SELECT Sum(Log(Abs(NULLIF(Value, 0)))) AS ABSMult, Sum(Sign(CASE WHEN Value <0 THEN 1 ELSE 0 END)) AS Neg, Min(Abs(Value)) AS MinVal FROM @values) foo RETURN @mul_value END
и го извиква:
SELECT *FROM Floats aCROSS APPLY (SELECT dbo.udf_mul((SELECT [стойност] FROM Floats b WHERE a.id>=b.id FOR XML PATH, ROOT('root'))) AS r) като cs(r);
Изход:
<предварителен код>╔═════╦════════╦═════════════════════╗║ id ║ стойност ╠═════╬════════╬════════════════════╣║ 1 ║ 1 ║ 1 ║║ 2 ║ 3 ║ 3.0000000000000004 ║║ 3 ║ 6 ║ 17.999999999999996 ║║ 4 ║ 2 ║ 36 ║╚═════╩════════╩═══════════════════ ═╝