Esportare occorenze da una stringa

giovedì 27 agosto 2009 - 11.16

the_driver Profilo | Senior Member

Ciao a tutti, ho una query che legge dei valori da un db tra cui un campo di tipo varchar (255)

select nome,cognome,campo_strig from table1

campo_string viene dato in pasto ad una funzione la quale deve estrarre dalla stringa delle sotto stringhe (o parole) e inserirle in una tabella di calcolo.

la tabella ha all'interno 2 campi varchar(255), chiamate "dato" e "sql"

Quando leggo la stringa dal DB , un suo possibile contenuto di campo_string può essere:

esempio

dato1--sql1||dato2--sql2

In questo esempio dovrei salvare dato1 e sql1(distintamente) , quindi successivamente salvare valore2 e sql2 .

il doppio carattere || mi delimita il numero di items , mentre il doppio carattere -- mi delimita i sotto valori che leggo

Questa operazione mi calcola il numero di Items presenti nella stringa:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
quindi nel caso precedente, mi trova che ci sono 2 items da leggere (per ogni items devo leggere i 2 valori).

Quindi ho anche pensato di fare cosi'
set @textbox_items=replace(@textbox_items,'||','|')

set @textbox_items=replace(@textbox_items,'--','-')



Purtroppo non ho trovato funzioni tipo str_pos e non saprei come procedere.


help!!

alx_81 Profilo | Guru

>Ciao a tutti, ho una query che legge dei valori da un db tra
>cui un campo di tipo varchar (255)
ciao

>Purtroppo non ho trovato funzioni tipo str_pos e non saprei come
>procedere.
hai due possibilità:

PATINDEX
http://msdn.microsoft.com/it-it/library/ms188395.aspx

CHARINDEX
http://msdn.microsoft.com/it-it/library/ms186323.aspx

Entrambe restituiscono le posizioni di una particolare stringa di ricerca. Ma si comportano diversamente. Leggi la doc che ti ho passato per capire.

più che altro, T-SQL non è fatto proprio per eseguire applicazioni di questo tipo. Quindi ti consiglio di evitare direttamente su db le operazioni di questo tipo.
Nel tuo caso forse è meglio preparare un set di dati prima applicativamente e poi effettuare solo le insert. Tuttavia i link che ti ho passato dovrebbero aiutarti.

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

the_driver Profilo | Senior Member

Ciao ALe, ho risolto (forse cosi)

while @occorrenze > 0 begin --CHARINDEX ( expression1 ,expression2 [ , start_location ] ) --la sub string andrà da @min a @max --SUBSTRING ( value_expression ,start_expression , length_expression ) set @max=CHARINDEX('|',@textbox_items,@min) set @calc=@max-@min set @temp=SUBSTRING(@textbox_items,@min,@calc) --trovata la sottostringa del primo item,controllo estraggo i primi 2 campi --campo 1 set @pos=CHARINDEX('-',@textbox_items,@min) set @calc=@pos-@min set @temp=SUBSTRING(@textbox_items,@min,@calc) --valore 1 set @min=@pos+1 --campo2 set @pos=CHARINDEX('-',@textbox_items,@min) set @calc=@pos-@min set @temp=SUBSTRING(@textbox_items,@min,@calc) --valore 2 --aggiorna @min con @max set @min=@max+1 set @occorrenze=@occorrenze-1; --decrementa il contatore delle occorreze end

al posto di "set temp ...." richiamo un "insert into ...."


penso che dovrebbe andare....

the_driver Profilo | Senior Member

ciao Alx81, ho modificato la funzione in questo modo

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Esenguendo ho il seguente errore
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

da cosa può dipendere? non vede la tabella dbo.temp_items? viene creata all'inizio della query (tutti i campi possono essere NULL)

create table dbo.temp_items( visit_name varchar(255), form_name varchar(255), component varchar(255), web_value varchar(255), sql_value varchar(255) )

Non capisco.....

alx_81 Profilo | Guru

>ciao Alx81, ho modificato la funzione in questo modo
Le operazioni DML non possono essere eseguite nelle funzioni.
Quindi niente insert, delete, update..
devi usare una stored procedure.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

the_driver Profilo | Senior Member

dici che riesco a convertire la mia funzione in stored procedure?

alx_81 Profilo | Guru

>dici che riesco a convertire la mia funzione in stored procedure?

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


per lanciarla:

EXEC dbo.proc_count_items 'testo'


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

the_driver Profilo | Senior Member

Sei un mito!!!! grazie!!!!!!
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5