2011-02-03 17 views
5

मैं त्रुटि हो रही है में कास्ट का उपयोग कर 'त्रुटि परिवर्तित डेटा प्रकार nvarchar फ्लोट करने के लिए' जब निम्नडेटा रूपांतरण त्रुटि जब एक मामला बयान

 declare 
    @completeCommand  nvarchar (max) = 'x' 
    ,@paramVal    nvarchar (100) 
    ,@paramName    nvarchar (100) 
    ,@paramType    nvarchar (100) 
    ,@tempParam    sql_variant 

    declare @parameterList table (
     RowID   int identity (1,1) 
    ,ParameterValue nvarchar (100) 
    ,ParameterName nvarchar (100) 
    ,ParameterType nvarchar (100) 
) 

    insert into @parameterList 
    values 
    ('10', 'Param1', 'int') 
    ,('test', 'Param2', 'nvarchar') 

    -- Process each parameter one at a time 
    declare ParameterCursor cursor fast_forward for 
    select ParameterValue, ParameterName, ParameterType 
    from @parameterList 
    order by RowID 

    open ParameterCursor 

    fetch next from ParameterCursor into @paramVal, @paramName, @paramType 

    if @@FETCH_STATUS = 0 
    set @completeCommand = @completeCommand + ' ' 

    while @@FETCH_STATUS = 0 
    begin 

    print @completeCommand 

    -- verify the datatype is correct 
    set @tempParam = case @paramType 
      when 'int' then CAST (@paramVal as int) 
      when 'float' then CAST (@paramVal as float) 
      when 'nvarchar' then CAST (@paramVal as nvarchar) 
      else 'NULL' 
     end 

    set @completeCommand = @completeCommand + @paramName + ' = ' + @paramVal + ',' 

    fetch next from ParameterCursor into @paramVal, @paramName, @paramType 
    end 

    close ParameterCurosr 
    deallocate ParameterCursor 

चल मुझे क्या करना कोशिश कर रहा हूँ की पुष्टि है कि उपयोगकर्ता दर्ज किया गया डेटा डेटा कमांड स्ट्रिंग में जोड़े जाने से पहले अपेक्षित डेटा प्रकार से मेल खाता है। उपर्युक्त कोड विफल होने पर कोई प्रतिक्रिया बहुत सराहना की जाएगी।

चीयर्स, जो

+0

मौलिक दोष - आप डेटा प्रकार के लिए उपयोगकर्ता इनपुट पर भरोसा कर रहे हैं। सिर्फ इसलिए कि मैं डेटा को "NVARCHAR" के रूप में टैग करता हूं, इसका मतलब यह नहीं है।आपको संख्यात्मक डेटा प्रकार पर कास्टिंग करने से पहले पुष्टि करने के लिए ISNUMERIC का उपयोग करने पर विचार करना चाहिए। –

+0

यह सच हो सकता है। लेकिन यह स्पष्ट नहीं करता है कि क्यों केस स्टेटमेंट सही WHEN क्लॉज का चयन नहीं करता है। –

+0

सावधान रहें, ISNUMERIC एक "IsAllDigits" फ़ंक्शन नहीं है। इस आलेख पर एक नज़र डालें (साइट पर मुफ्त पंजीकरण): http://www.sqlservercentral.com/articles/IsNumeric/71512/ – Tony

उत्तर

6

मुद्दा यह है कि मामला उच्चतम precidence, जिनमें से है इस बयान के लिए नाव के साथ डेटा प्रकार वापस आ जाएगी है। CASE (Transact-SQL) और Data Type Precedence (Transact-SQL) देखें।

इस CASE एक फर्जी WHEN 'xzy' then CAST (@paramVal as sql_variant) जो CASE वापसी डेटा प्रकार के रूप sql_variant उपयोग करने के लिए कारण होगा जोड़ने के काम करने के लिए प्राप्त करने के लिए।

या CASE हटाने और IF-ELSE उपयोग करते हैं, जैसे:

IF @paramType='int' 
    set @tempParam = CAST (@paramVal as int) 
ELSE IF @paramType='float' 
    set @tempParam = CAST (@paramVal as float) 
ELSE IF @paramType='nvarchar' 
    set @tempParam = CAST (@paramVal as nvarchar) 
ELSE 
    set @tempParam = NULL 
+0

फर्जी जब खंड काम किया। –

0

आप क्या इस्तेमाल किया सरल प्रकरण समारोह था। खोजे गए केस फ़ंक्शन को काम करना चाहिए (नीचे देखें)। मैं सिर्फ एक बहुत ही सरल प्रश्न में यह कोशिश की है:

सरल मामले समारोह:

DECLARE @type VARCHAR(100) 
DECLARE @input VARCHAR(100) 
DECLARE @value SQL_VARIANT 

SET @type = 'varchar' 
SET @input = 'test' 

SET @value = CASE 
    WHEN @type = 'varchar' THEN @input 
    WHEN @type = 'int' THEN CAST(@input AS VARCHAR) 
END 

SQL सर्वर 2005 मैं एक ही त्रुटि हो रही है, लेकिन निम्न पर एसक्यूएल सर्वर 2008 दस्तावेज़ है

  • input_expression का मूल्यांकन करता है, और फिर निर्दिष्ट क्रम में, प्रत्येक WHEN खंड के लिए input_expression = when_expression का मूल्यांकन करता है।
  • पहले input_expression = when_expression का परिणाम_expression देता है जो TRUE का मूल्यांकन करता है।
  • यदि कोई input_expression = when_expression TRUE का मूल्यांकन नहीं करता है, तो SQL सर्वर 2005 डेटाबेस इंजन किसी ELSE क्लॉज निर्दिष्ट होने पर else_result_expression देता है, या कोई ELL क्लॉज निर्दिष्ट नहीं होने पर एक पूर्ण मान देता है।

खोजे गए मामले समारोह:

  • मूल्यांकन करता है, आदेश में निर्दिष्ट, Boolean_expression प्रत्येक के लिए जब खंड।
  • ट्रू का मूल्यांकन करने वाले पहले Boolean_expression के परिणाम_expression देता है।
  • यदि कोई Boolean_expression सत्य का मूल्यांकन नहीं करता है, तो कोई भी ELSE क्लॉज निर्दिष्ट होने पर डेटाबेस इंजन अन्य_result_expression देता है, या कोई पूर्ण मान निर्दिष्ट नहीं होता है।

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

अन्यथा, आप शायद IF का उपयोग कर सकते हैं ... फिर ... ELSE, जैसा कि किसी अन्य उत्तर में प्रस्तावित किया गया है।

+0

आप मेरे द्वारा किए गए वही दस्तावेज़ उद्धृत करते हैं, सिवाय इसके कि आप यह निर्धारित करते हैं कि केस किस प्रकार उपयोग करता है और किस डेटा प्रकार को वापस नहीं किया जाता है। दस्तावेज़ में, "सरल केस फ़ंक्शन" शीर्षक से ठीक पहले जाएं और देखें 'परिणाम_एक्सप्रेस और वैकल्पिक else_result_expression में प्रकारों के सेट से उच्चतम प्राथमिकता प्रकार देता है।' यह कुंजी है: 'डेटा प्रकार जो लौटाया गया है', यदि यदि आप स्ट्रिंग को वापस करने का प्रयास करते हैं, तो यह स्थिति एक फ्लोट लौटने का निर्धारण करती है (जैसा कि यह यहां है), आपको कनवर्ट त्रुटि मिलती है। –

+0

जारी रहा ... जैसा कि मेरा उत्तर कहता है, CASE को संशोधित करें, इसलिए sql_variant प्रकार लौटाया गया है (इसमें फ्लोट की तुलना में अधिक प्राथमिकता है) या केवल आईएफ-ईएलएसई –

+0

का उपयोग करें मैंने कोशिश की लेकिन मुझे एक ही त्रुटि मिली –

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