2008-10-29 18 views
5

में एक गणना डेटाटाइम कॉलम जारी रखना मेरे पास एक तालिका में एक एक्सएमएल कॉलम है; मैं उस एक्सएमएल में एक निश्चित मूल्य को "गणना" करना चाहता हूं, जो एक गणना कॉलम के रूप में और इसे तेजी से खोज के लिए अनुक्रमणित करता है।SQL सर्वर 2005

ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS ([dbo].[fComputeValue]([CustomMetadataColumn])) PERSISTED 

मैं निम्नलिखित त्रुटि मिलती है: जब मैं गणना स्तंभ बनाने का प्रयास करें

CREATE FUNCTION [dbo].[fComputeValue] (@data XML) 
RETURNS datetime 
WITH SCHEMABINDING 
AS 
BEGIN 
    RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'datetime') 
END 

हालांकि: मैं एक समारोह है कि इस तरह एक्सएमएल जानकारी में ले जाता है और ब्याज की तत्व आउटपुट, है:

Msg 4936, Level 16, State 1, Line 2 Computed column 'StartDate' in table 'CustomMetadataTable' cannot be persisted because the column is non-deterministic.

यह काम करता है अगर मैं:

  • वर्चर, int, डबल (यानी। datetime के अलावा अन्य) को महत्व देता
  • कायम कीवर्ड निकालने (लेकिन फिर मैं स्तंभ पर एक सूचकांक)

मैं भी कि datetime मान XSD दिनांक प्रारूप में हैं उल्लेख करना चाहिए नहीं बना सकते। कोई विचार? धन्यवाद।

उत्तर

6

के बारे में क्या:

CREATE FUNCTION [dbo].[fComputeValue] (@data XML) 
RETURNS varchar(50) 
WITH SCHEMABINDING 
AS 
BEGIN 
    RETURN @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'varchar(50)') 
END 

और:

ALTER TABLE dbo.CustomMetadataTable ADD [StartDate] AS (convert(datetime,([dbo].[fComputeValue]([CustomMetadataColumn]), 127)) PERSISTED 

या:

return convert(datetime, @data.value('(/Metadata/Value[@Key="StartDate"])[1]', 'varchar(50)'), 127) 

पुस्तकों से ऑनलाइन:

CONVERT is Deterministic unless one of these conditions exists:

Source type is sql_variant.

Target type is sql_variant and its source type is nondeterministic.

Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified. To be deterministic, the style parameter must be a constant. Additionally, styles less than or equal to 100 are nondeterministic, except for styles 20 and 21. Styles greater than 100 are deterministic, except for styles 106, 107, 109 and 113.

यदि आप CONVERT शैली 127

+0

धन्यवाद के साथ CONVERT का उपयोग कर सकते हैं तो यह मदद कर सकता है! मुझे भी यही समस्या थी। मुझे आश्चर्य है कि 127 काम क्यों करते हैं जब दूसरों को नहीं? – harpo

+0

यही कारण है: "स्टाइल 106, 107, 109 और 113 के अलावा, 100 से अधिक शैलियां निर्धारक हैं।" –

+0

एल्टर टेबल स्टेटमेंट को बदलने के बजाए, आप fComputeValue FUNCTION परिभाषा को भी बदल सकते हैं: फ़ंक्शन डेटाटाइम को वापस कर सकता है क्योंकि ओपी चाहता था, अगर आप कार्य के शरीर/कार्यान्वयन में शैली 127 के साथ CONVERT का आह्वान करते हैं। – ChrisW