none
Validazione di un campo ad esempio di un codice fiscale RRS feed

  • Domanda

  • Salve a tuti,

    volevo sapere se esite una funzione di T-SQL (in ORACLE mi sembra ci sia la TRANSLATE che aiuta) che valida un campo in base  ad un format.

    Quindi controllare ad esempio un codice fiscale le cui prime 6 lettere devono essere ALFABETICHE, le successive 2 solo numeriche, etc.etc,.

    Se non esiste una funzione analoga come implementereste una validazione del genere?

    Grazie

    Saluti

    venerdì 31 agosto 2012 16:56

Risposte

  • salve,

    un check non deterministico e' ad esempio possibile utilizzando l'operatore LIKE, http://msdn.microsoft.com/it-it/library/ms179859.aspx, similarmente a

    DECLARE @cod char(16) = 'DLLCML88M06G482W';
    
    IF @cod LIKE '[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9][A-Z][0-9][0-9][A-Z][0-9][0-9][0-9][A-Z]'
    	PRINT 'forse valido';
    ELSE
    	PRINT 'sicuramente sbagliato';

    LIKE consente di indicare un "pattern" che deve essere rispettato nel confronto valutato... [A-Z] prevede "tutte le lettere", mentre [0-9] "tutti i numeri", e va reiterato a coprire tutte la stringa alfanumerica da verificare in modo da compilare un pattern chiuso e "potenzialmente" valido..

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    • Contrassegnato come risposta Richard4You lunedì 3 settembre 2012 08:04
    domenica 2 settembre 2012 17:08
    Moderatore

Tutte le risposte

  • salve,

    si potrebbe aprire un'ampia discussione :)... la validazione che potresti in effetti effettuare e' puramente "matematica" ma non reale, in quanto la gestione dei duplicati e' delegata direttamente dall'anagrafe tributaria, quindi avresti come soluzione un "circa" che non e' da considerarsi attendibile per principio... ad esempio puoi vedere una soluzione tipo http://usenet.it.rooar.com/showthread.php?t=352797 , ma, di nuovo, non considerare l'algoritmo attendibile...

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    domenica 2 settembre 2012 00:12
    Moderatore
  • Ciao e grazie innanzitutto per il contributo.

    Forse mi sono spiegato male, ma per validazione intendo solo conoscere se un codice fiscale sia corretto. Non voglio ne calcolarlo ne conoscere se è realmente univoco etc etc..

    Intendevo dire se esiste una funzione builtin o altro per capire se un codice fiscale è corretto.

    Ad esempio un cod fiscale corretto potrebbe essere DLLCML88M06G482W ma se ci fossero dei numeri nelle prime cifre sicuramente è errato (DL8CML88M06G482W).

    Da una ricerca sulla rete ho capito che in pl-sql esiste lo statement o function TRANSLATE che a fronte di un format ($$$###) si riesce a stabilire la correttezza di un'informazione.

    Esiste una funzione che fà qualcosa di simile in T-SQL già pronto? Oppure un workaround da utilizzare?

    Ciao

    Grazie


    • Modificato Richard4You domenica 2 settembre 2012 12:42 completamento
    domenica 2 settembre 2012 12:38
  • salve,

    un check non deterministico e' ad esempio possibile utilizzando l'operatore LIKE, http://msdn.microsoft.com/it-it/library/ms179859.aspx, similarmente a

    DECLARE @cod char(16) = 'DLLCML88M06G482W';
    
    IF @cod LIKE '[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9][A-Z][0-9][0-9][A-Z][0-9][0-9][0-9][A-Z]'
    	PRINT 'forse valido';
    ELSE
    	PRINT 'sicuramente sbagliato';

    LIKE consente di indicare un "pattern" che deve essere rispettato nel confronto valutato... [A-Z] prevede "tutte le lettere", mentre [0-9] "tutti i numeri", e va reiterato a coprire tutte la stringa alfanumerica da verificare in modo da compilare un pattern chiuso e "potenzialmente" valido..

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    • Contrassegnato come risposta Richard4You lunedì 3 settembre 2012 08:04
    domenica 2 settembre 2012 17:08
    Moderatore
  • Potresti usare una RegularExpression in combinazione a CLR, poichè la funzione di regular expression in sql puro mi pare non ci sia.

    Forse puoi creare anche un vincolo sempre utilizzando la funzione clr

    lunedì 3 settembre 2012 06:25
  • Ottimo è perfetto per quello che mi serve.

    Grazie 1000

    lunedì 3 settembre 2012 08:03
  • Hai un esempio? Mi interessa, non riesco a trovare niente sulla rete.
    lunedì 3 settembre 2012 08:05
  • salve Alessandro,

    senza un quid aggiuntivo, mi pare che scomodare il CLR sia fuori luogo...

    un check constraint con "questa" validazione si puo' tranquillamente fare anche in puro Transact-SQL,

    SET NOCOUNT ON;
    USE tempdb;
    GO
    CREATE TABLE dbo.t (
    	Id int NOT NULL PRIMARY KEY,
    	cf char(16) NOT NULL
    		CHECK (cf LIKE '[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9][A-Z][0-9][0-9][A-Z][0-9][0-9][0-9][A-Z]')
    	);
    GO
    INSERT INTO dbo.t
    	VALUES ( 1,  'DLLCML88M06G482W' );
    GO
    INSERT INTO dbo.t
    	VALUES ( 2,  'DLLCML88M06G4820' );
    GO
    DROP TABLE dbo.t;

    se poi, invece, nel codice CLR effettui validazioni diverse, magari con roundtrip su un webserver che riscontri l'attendibilita' del dato in esame, allora la cosa e' diversa... ma per usare il solo REGEX, non mi scomoderei affatto.. :)

    saluti


    http://www.asql.biz - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    lunedì 3 settembre 2012 19:56
    Moderatore
  • si effettivamente se quella like funziona (non ho motivo di dubitarne) meglio fare così.

    A caldo pensavo subito a clr e regex perchè non mi ricordavo che l'operatore like di sqlserver delimitando tra parentesi quadre poteva fare al caso

    martedì 4 settembre 2012 05:56
  • cmq è utile sapere che si può fare anche nel tuo modo... magari per qualche altro scopo!

    Grazie

    martedì 4 settembre 2012 08:03
  • cercando in google regular expression clr sql server ci sono diverse risorse

    tra cui

    http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

    http://www.codeproject.com/Articles/85954/Use-RegEx-in-SQL-with-CLR-Procs

    http://www.ideaexcursion.com/2009/08/18/sql-server-regular-expression-clr-udf/

    magari come primo punto capire come si usa clr in sqlserver che in alcuni casi può essere utile. Praticamente puoi usare il framework .net e tutte le sue funzioni all'interno di sql.  Avevo cominciato ad usarlo per implementare la funzione Split non presente in T-Sql (non sò se l'hanno aggiunta nel frattempo)

    ciao

    martedì 4 settembre 2012 08:19