none
Validazione di un campo ad esempio di un codice fiscale

    Question

  • 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

    Friday, August 31, 2012 4:56 PM

Answers

  • 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/

    • Marked as answer by Richard4You Monday, September 03, 2012 8:04 AM
    Sunday, September 02, 2012 5:08 PM

All replies

  • 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/

    Sunday, September 02, 2012 12:12 AM
  • 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


    • Edited by Richard4You Sunday, September 02, 2012 12:42 PM completamento
    Sunday, September 02, 2012 12:38 PM
  • 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/

    • Marked as answer by Richard4You Monday, September 03, 2012 8:04 AM
    Sunday, September 02, 2012 5:08 PM
  • 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

    Monday, September 03, 2012 6:25 AM
  • Ottimo è perfetto per quello che mi serve.

    Grazie 1000

    Monday, September 03, 2012 8:03 AM
  • Hai un esempio? Mi interessa, non riesco a trovare niente sulla rete.
    Monday, September 03, 2012 8:05 AM
  • 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/

    Monday, September 03, 2012 7:56 PM
  • 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

    Tuesday, September 04, 2012 5:56 AM
  • cmq è utile sapere che si può fare anche nel tuo modo... magari per qualche altro scopo!

    Grazie

    Tuesday, September 04, 2012 8:03 AM
  • 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

    Tuesday, September 04, 2012 8:19 AM