मैं इस प्रकार के ऑपरेशन के लिए स्केलर फ़ंक्शन का उपयोग नहीं करता। आप खराब प्रदर्शन के साथ समाप्त होते हैं क्योंकि क्वेरी अनुकूलक को इसे row-by-row
चलाने की आवश्यकता होती है बिना किसी इष्टतमीकरण के। और जानकारी:SQL Server Functions: The Basics
।
दूसरा फ्लोट/दशमलव और LOG/EXP
. के साथ आपको सन्निकटन त्रुटियाँ मिलेंगी।
कार्य करने के लिए डेटा पास करने के लिए तीसरा आप XML
. का उपयोग कर सकते हैं जैसे:
CREATE FUNCTION dbo.udf_Mul(@value xml)
RETURNS FLOAT
AS
BEGIN
DECLARE @mul_value FLOAT;
DECLARE @values AS TABLE ([value] float);
INSERT INTO @values([value])
SELECT [value] = t.c.value('(value)[1]', 'float')
FROM @value.nodes('//row') 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 a
CROSS APPLY (SELECT dbo.udf_mul((SELECT [value]
FROM Floats b
WHERE a.id >= b.id
FOR XML PATH, ROOT('root')))
AS r) as cs(r);
आउटपुट:
╔═════╦════════╦════════════════════╗
║ id ║ value ║ r ║
╠═════╬════════╬════════════════════╣
║ 1 ║ 1 ║ 1 ║
║ 2 ║ 3 ║ 3.0000000000000004 ║
║ 3 ║ 6 ║ 17.999999999999996 ║
║ 4 ║ 2 ║ 36 ║
╚═════╩════════╩════════════════════╝