जैसा कि त्रुटि से पता चलता है, अंतिम विवरण रिटर्न स्टेटमेंट होना चाहिए। कुछ अन्य भाषाओं के विपरीत IF/ELSE
. का प्रवाह संकलन के दौरान कथन की जाँच नहीं की जाती है, इसलिए SQL सर्वर को पता नहीं है कि शाखाओं में से एक अनिवार्य है (यहां तक कि ELSE
) ) चूंकि यह चेक नहीं किया गया है, यह जानने का कोई तरीका नहीं है कि क्या फ़ंक्शन एक मान लौटाएगा जब तक कि अंतिम विवरण एक रिटर्न स्टेटमेंट न हो। इस तरह का एक साधारण कार्य भी विफल हो जाएगा:
CREATE FUNCTION dbo.FlowTest()
RETURNS INT
AS
BEGIN
IF 1 = 1
BEGIN
RETURN 1;
END
ELSE
BEGIN
RETURN 0;
END
END
समाधान केवल ELSE
. को हटाना है :
CREATE FUNCTION dbo.FlowTest()
RETURNS INT
AS
BEGIN
IF 1 = 1
BEGIN
RETURN 1;
END
-- ELSE REMOVED
RETURN 0;
END
पहले RETURN
. पर पहुंचने पर फंक्शन का निष्पादन रुक जाएगा , तो ELSE
वैसे भी आवश्यक नहीं है।
तो आपका कार्य बन जाएगा:
ALTER FUNCTION [dbo].[GetBatchReleaseQuantity]
(
@i_LocationID VARCHAR(50),
@i_ProductID INT,
@i_StartDate VARCHAR(50),
@i_EndDate VARCHAR(50),
@i_ProductInFlow int
)
RETURNS numeric(18,3)
--WITH ENCRYPTION
AS
BEGIN
IF (@i_ProductInFlow ='2')
BEGIN
RETURN (SElECT ISNULL( SUM( BatchReleaseQuantity),0.00)
FROM BatchReleaseDetails BRD
LEFT OUTER JOIN BatchRelease BR
ON BR.BatchReleaseID=BRD.BatchReleaseID
WHERE ProductId = @i_ProductID
AND LocationID = @i_LocationID
AND BRD.CreatedOn >= CONVERT(DATETIME, @i_StartDate+' 00:00:00')
AND BRD.CreatedOn <= CONVERT(DATETIME,@i_EndDate + ' 23:59:59')
)
END
RETURN ( SELECT ISNULL( SUM( AcceptedQuantity),0.00)
FROM GoodsReceivedNoteDetail GRND
LEFT OUTER JOIN GoodsReceivedNote GRN
ON [email protected]_LocationID
WHERE ProductId = @i_ProductID
AND GRN.LocationID = @i_LocationID
AND GRND.CreatedOn >= CONVERT(DATETIME, @i_StartDate+' 00:00:00')
AND GRND.CreatedOn <= CONVERT(DATETIME, @i_EndDate+' 23:59:59')
)
END
END
मैं यह नहीं देख सकता कि फ़ंक्शन कैसे अच्छा प्रदर्शन करेगा, और आप एक वर्चर के रूप में एक तिथि क्यों पारित कर रहे हैं यह मेरे से परे है। क्या आप उन चीज़ों की परवाह नहीं करते जो 23:59:59 और आधी रात के बीच बनाई गई थीं?
मैं इसे एक इनलाइन टेबलवैल्यूड फ़ंक्शन के रूप में पुन:सक्रिय करने के लिए इच्छुक हूं, और तिथियों का ठीक से उपयोग करता हूं, उदा।
CREATE FUNCTION [dbo].[GetBatchReleaseQuantityTVP]
(
@i_LocationID VARCHAR(50),
@i_ProductID INT,
@i_StartDate DATE,
@i_EndDate DATE,
@i_ProductInFlow int
)
RETURNS TABLE
--WITH ENCRYPTION
AS
RETURN
( SElECT ReturnValue = ISNULL( SUM( BatchReleaseQuantity),0.00)
FROM BatchReleaseDetails BRD
LEFT OUTER JOIN BatchRelease BR
ON BR.BatchReleaseID=BRD.BatchReleaseID
WHERE ProductId = @i_ProductID
AND LocationID = @i_LocationID
AND BRD.CreatedOn >= @i_StartDate
AND BRD.CreatedOn < DATEADD(DAY, 1, @i_EndDate)
AND @i_ProductInFlow ='2'
UNION ALL
SELECT ISNULL(SUM( AcceptedQuantity),0.00)
FROM GoodsReceivedNoteDetail GRND
LEFT OUTER JOIN GoodsReceivedNote GRN
ON [email protected]_LocationID
WHERE ProductId = @i_ProductID
AND GRN.LocationID = @i_LocationID
AND GRND.CreatedOn >= @i_StartDate
AND GRND.CreatedOn < DATEADD(DAY, 1, @i_EndDate)
AND ISNULL(@i_ProductInFlow, '') != '2'
);
फिर जब भी आप dbo.GetBatchReleaseQuantity(...)
. पर कॉल करेंगे बस पर कॉल करें (dbo से रिटर्न वैल्यू चुनें। GetBatchReleaseQuantityTVP (...)) . यह काफी बेहतर प्रदर्शन करेगा, और अमान्य तिथियों को वर्चर पैरामीटर में पारित करने वाले लोगों से भी बच जाएगा।