2013-01-02 15 views
12

मैं एक गणना स्तंभ के लिए इस समारोह है:गणना नहीं बच सकते हैं स्तंभ - निर्धारित करने योग्य नहीं

CREATE FUNCTION [dbo].[GetAllocatedStartTime](@Year INT, @Week INT) 
RETURNS DATETIME 

WITH schemabinding 
AS BEGIN 
    RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT([varchar](4),@Year,(0))+'-01-01'),(1)))) 
END 

GO 

मैं आशा में WITH schemabinding कहा कि यह यह नियतात्मक तो मैं यह बच सकते हैं होगा। यह दो इनपुट [Week] और [Year] के समान होना चाहिए, हमेशा एक ही परिणाम प्राप्त करेंगे।

सटीक त्रुटि है:

परिकलित स्तंभ तालिका में 'AllocatedTimeStart' 'Tmp_Bookings' क्योंकि स्तंभ गैर नियतात्मक है कायम नहीं किया जा सकता।

मैं कॉलम में इस सूत्र का उपयोग कर रहा हूँ:

([dbo].[GetAllocatedStartTime]([Year],[Week])) 

और स्तंभ defs:

[Week] [int] NOT NULL, 
[Year] [int] NOT NULL, 
[AllocatedTimeStart] AS ([dbo].[GetAllocatedStartTime]([Year],[Week])), 

कोई भी विचार?

संपादित करें:

बदला गया लाइन के लिए:

RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1)))) 

लेकिन अब मैं स्तंभ के लिए सूत्र कह एक त्रुटि अमान्य है मिलता है। भले ही समारोह ठीक बचाता है।

संपादित करें 2:

मैं बिल्कुल दिखाया है मैं क्या कर रहा हूँ (या कम से कम मैं कोशिश की है)। वास्तव में कुछ भी अतिरिक्त नहीं है। जैसा कि यह कहता है कि कॉलम में फॉर्मूला रेफ [dbo].AllocatedStartDate(...) के साथ पिछले फ़ंक्शन (मूल एक) के साथ जोड़ा गया था, लेकिन यह जारी नहीं था, यह कहा गया कि यह गैर निर्धारक नहीं था। तो सुझाव के अनुसार मैं फंक्शन बदल गया है, नए कोड के साथ रूपांतरण भाग की जगह है, तो समारोह अब लगता है कि:

FUNCTION [dbo].[GetSTime](@Year INT, @Week INT) 

RETURNS DATETIME 
WITH schemabinding 
AS BEGIN 
    RETURN dateadd(week,@Week-(1),dateadd(day,(-1),dateadd(week,datediff(week,(0),CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)),(1)))) 
END 

तो मैं गणना क्षेत्र (([dbo].[GetAllocatedStartTime]([Year],[Week]))) में पहले की तरह ही सूत्र कोशिश की ... और यह फॉर्मूला को अस्वीकार करता है, कहता है कि यह वैध नहीं है ... जो कि सूत्र है जैसा कि अजीब है, इसलिए यह बदले गए फ़ंक्शन की किसी प्रकार की जांच कर रहा है और यह अमान्य होना है, जो भी अजीब है क्योंकि मैंने किया सादा SELECT dbo.GetAllocatedStartTime(2012,13) और यह काम किया ...

तो हाँ मैं उलझन में हूं, और मैंने कभी भी SqlFiddle कभी इसका उपयोग नहीं किया है। लेकिन वास्तव में मैंने जो कुछ कहा है उससे कहीं ज्यादा कुछ नहीं है।

+1

समस्या आपके फ़ंक्शन के साथ नहीं है, इसकी तालिका पर गणना कॉलम के साथ। अपने प्रश्न पर उस परिभाषा को पोस्ट करें ताकि हम आपकी मदद कर सकें – Lamak

+0

एसक्यूएल-सर्वर का कौन सा संस्करण है? –

+0

@ypercube 2008 आर 2 – sprocket12

उत्तर

16

CONVERT([varchar](4),@Year,(0))+'-01-01'DATEDIFF कॉल पर एक ऐसी स्थिति में पारित किया जा रहा है, जहां एक अनुमानित रूपांतरण हो रहा है।

deterministic functions के लिए नियमों से

:

CAST

नियतात्मक datetime, smalldatetime, या sql_variant के साथ प्रयोग किया है, जब तक।

CONVERT

नियतात्मक जब तक इन शर्तों में से एक मौजूद है:

...

स्रोत या लक्ष्य प्रकार datetime या smalldatetime, अन्य स्रोत है या लक्ष्य प्रकार एक चरित्र स्ट्रिंग है, और एक nondeterministic शैली निर्दिष्ट है। निर्धारिती होने के लिए, शैली पैरामीटर स्थिर होना चाहिए। साथ ही, शैलियों से 100 से कम या बराबर, गैर नियतात्मक हैं शैलियों 20 के अलावा और 21 शैलियाँ 100 से अधिक, नियतात्मक हैं शैलियों 106, 107, 109 और 113.

खैर के अलावा, आप कॉल कर रहे न , लेकिन आप एक अंतर्निहित रूपांतरण पर भरोसा कर रहे हैं, जिसे मैं CAST जैसे कार्य करने की अपेक्षा करता हूं। इस पर भरोसा करने के बजाय, मैं CONVERT का उपयोग करने के लिए स्विच करता हूं और एक निर्धारक शैली पैरामीटर देता हूं।

तो, मैं करूँगा: CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112) इसके स्थान पर। ऐसा करने के बाद, फ़ंक्शन स्वयं निर्धारक बन जाता है

+0

यदि SQL-Server 2012 पर, वे 'कन्वर्ट ([वर्कर] (4), @ वर्ष, (0)) +' - 01-01'' 'के बजाय -' DATEFROMPARTS ([वर्ष], 1,1) 'फ़ंक्शन: [एसक्यूएल-फिल्ड टेस्ट] (http://sqlfiddle.com/#!6/7a872) –

+0

हाय वहाँ मैंने भाग को प्रतिस्थापित करने की कोशिश की, लेकिन मैंने एक और मुद्दा मारा:/कृपया उपरोक्त संपादन देखें। – sprocket12

संबंधित मुद्दे