Welcome to Sign in | Help
in Search

Functia CAST

Last post 11-28-2007, 8:30 AM by cretzu. 4 replies.
Sort Posts: Previous Next
  •  11-27-2007, 2:24 PM 3469

    Functia CAST

    Salut,

    va rog imi poate spune cineva cum as putea prinde o eroare de conversie intoarsa de functia CAST intr-o functie fara sa folosesc TRY CATCH. Incerc sa fie compatibila si cu SQL Server 2000 si cu 2005. Lucrez pe un 2005.

    Uitati ce am incercat :)

    DECLARE @x AS VARCHAR(50)

    .... 

    SELECT @y = CAST(@x AS BIGINT)

    IF @@ERROR  <> 0

    BEGIN

        SET @eroare = 'eroare la conversie'

        RETURN

    END 

     


    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
    Filed under: ,
  •  11-27-2007, 2:55 PM 3473 in reply to 3469

    Re: Functia CAST

    Eu ţi-aş recomanda să eviţi eroarea (în loc să o tratezi), verificând înainte de conversie dacă acea conversie e posibilă. O modalitate ar fi să foloseşti funcţia ISNUMERIC:

     

    DECLARE @x AS VARCHAR(50), @y bigint, @eroare nvarchar(255)
    SET @x='12a3'

    IF ISNUMERIC(@x)<>0 SET @y = CAST(@x AS BIGINT)
    ELSE SET @eroare = 'eroare la conversie'

    SELECT @y, @eroare

    Dar funcţia ISNUMERIC nu returnează totdeauna ceea ce te aştepţi (încearcă de exemplu cu '.', '$', '1e3', etc). Pentru explicaţii şi soluţii alternative, vezi: http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html

    Răzvan 

  •  11-27-2007, 3:01 PM 3474 in reply to 3473

    Re: Functia CAST

    merci :)

    imi merge cu ISNUMERIC

     

    Daniel.
     


    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
  •  11-27-2007, 3:57 PM 3475 in reply to 3474

    Re: Functia CAST

    După cum a scris şi Răzvan, IsNumeric este o funcţie problematică.

    Poţi încerca următoarea soluţie care verifică dacă un şir de caractere reprezintă un număr întreg pozitiv.

     

    CREATE TABLE TestIsNumeric(Valoare VARCHAR(25) PRIMARY KEY)
    GO

    INSERT INTO TestIsNumeric VALUES('123')
    INSERT INTO TestIsNumeric VALUES(' 123 ')
    INSERT INTO TestIsNumeric VALUES('.')
    INSERT INTO TestIsNumeric VALUES('.1')
    INSERT INTO TestIsNumeric VALUES('$123')
    INSERT INTO TestIsNumeric VALUES('12e3')
    INSERT
    INTO TestIsNumeric VALUES('12 3')
    INSERT INTO TestIsNumeric VALUES('e')
    GO
    SELECT '['+Valoare+']' AS Val,   
                ISNUMERIC(Valoare) AS Is_Numeric,
          CASE
                      WHEN LEN(RTRIM(LTRIM(Valoare)))>=1 AND
    LEN(RTRIM(LTRIM(Valoare)))<=18 AND PATINDEX('%[^0-9]%',RTRIM(LTRIM(Valoare)))=0 THEN 1
                     
    ELSE 0
          END AS Este_Bigint_Pozitiv

    FROM TestIsNumeric
    GO

     Soluţia poate fi adaptată şi pentru valori care includ operatorii unari +/-, inclusiv pentru a putea accepta toate valorile numerice pozitice admise de BIGINT.

  •  11-28-2007, 8:30 AM 3478 in reply to 3475

    Re: Functia CAST

    Salut,

    Merci pentru solutie. 

    Cu Functia ISNUMERIC am observat si eu ieri niste anomalii pentru ca in anumite cazuri cum ar fi daca acel varchar este null sau daca este '' (stringul vid) face automat ceva conversie si mi-l intoarce ca si 0 :((.

    Merci amandorura pentru solutiile date ;)

     

    Daniel. 


    MCP (C Sharp)
    Software Engineer,
    Cluj Napoca
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems