MsSQL2005: INSTR vs CHARINDEX

lunedì 26 maggio 2008 - 16.59

rebzone Profilo | Newbie

Ciao a tutti,
mi sono appena registrato al forum e vi pongo immediatamente un quesito che mi sta facendo impazzire :(

Programmo in vb.net, e sto tentando di fare l'upsize di un db sviluppato (ed utilizzato per 3 anni) in Access a MSSQL (del quale sono alle primissime armi).
A parte il fatto che ho già dovuto riscrivere metà programma, mi si pone il problema delle query SQL.
In particolare, il primo ostacolo che non riesco a superare è il seguente:
nel database ho una colonna con salvate all'interno delle array (ad es. "1,5,3,4,13"), sulle quali, finchè il programma poggiava su access, utilizzavo la funzione INSTR nel seguente modo:

... INSTR(',' & ColumnName & ',' , ',3,') ...

per controllare se all'interno del campo interrogato figurava il valore 3 (capirete questa forma meglio di me, ma per chiarezza la spiego ulteriormente: praticamente, i valori indicati sopra, "1,5,3,4,13" li "trasformo" in ",1,5,3,4,13," in modo da controllare che effettivamente il valore 3 ci sia e, eventualmente, sia unico (se non aggiungessi le virgole all'inizio e alla fine del campo, l'interrogazione mi restituirebbe anche il valore 13)).

Ora, in MsSQL ho provato ad utilizzare la stessa modalità con la funzione CHARINDEX nel modo seguente:

... CHARINDEX(',3,' , ',' & ColumnName & ',') ...

ma non funziona...cioè funzionerebbe, ma non mi permette di aggiungere le virgole come in Access, e questo era un requisito fondamentale affinchè mi estraesse soltanto il valore 3 e non anche il 13.

Come posso fare? ...Ho visto che si fa un gran parlare di stored procedures, ma come vi ho già detto, con MsSQL sono totally noob. Oltre a ciò, mi piacerebbe riuscire a gestire tutto via codice nell'applicazione vb, in modo che se mi si ripresentasse la necessità di cambiare nuovamente il motore di database, avrei comunque tutto a portata di mano nel codice. Eventualmente, la stored procedure, la potrei creare via codice o deve perforza risiedere nel database?

Grazie infinite a tutti

lbenaglia Profilo | Guru

>Ora, in MsSQL ho provato ad utilizzare la stessa modalità con
>la funzione CHARINDEX nel modo seguente:
>
>... CHARINDEX(',3,' , ',' & ColumnName & ',') ...
>
>ma non funziona...cioè funzionerebbe, ma non mi permette di aggiungere
>le virgole come in Access, e questo era un requisito fondamentale
>affinchè mi estraesse soltanto il valore 3 e non anche il 13.

Ciao Alberto,

in SQL Server l'operatore di concatenazione delle stringhe è il "+" non la "&" come in Access.

>Come posso fare? ...Ho visto che si fa un gran parlare di stored
>procedures, ma come vi ho già detto, con MsSQL sono totally noob.
Il problema principale è che il tuo "array" non rispetta la prima forma normale (a prescindere dal DBMS), quindi è una scelta infelice che hai compiuto in fase di design della base dati.
Potevi risolvere elegantemente il problema con una classica reazione 1-a-molti.

>Oltre a ciò, mi piacerebbe riuscire a gestire tutto via codice
>nell'applicazione vb, in modo che se mi si ripresentasse la necessità
>di cambiare nuovamente il motore di database, avrei comunque
>tutto a portata di mano nel codice. Eventualmente, la stored
>procedure, la potrei creare via codice o deve perforza risiedere
>nel database?
Nel db.

>Grazie infinite a tutti
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

rebzone Profilo | Newbie

grazie mille per la risposta...mi hai risparmiato un sacco di tempo (bastava effettivamente sostituire i + agli &).

Grazie ancora e ciao! :)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5