Estrazione campi

lunedì 29 ottobre 2007 - 12.11

marko80 Profilo | Junior Member

Ciao a tutti!
Ho un piccolo problema da risolvere.

Io ho questo campo "chiave_tabella" (tipo stringa):
2007\^/OVE\^/1\^/1
2007\^/OVE\^/16\^/10
2007\^/OVE\^/162\^/100
ecc...
Dovrei ottenere invece quattro campi: anno (2007), protocollo(OVE), numero (16), riga (2)
risultato finale: 2007 OVE 16 2

Ho fatto in questo modo:
LEFT (chiave_tabella; 4) (per ricavare l'anno)
SUBSTRING(chiave_tabella; 8; 3) (per ricavare il protocollo)

il mio problema è ricavare il numero e la riga. Numero e riga devono essere di tipo numerico.
Grazie a tutti per l'aiuto.

AndreaKpr Profilo | Senior Member

Ciao.
Potresti leggere il campo e buttarlo in una stringa e poi fare lo split per "\^/"

Quiandi la stringa "2007\^/OVE\^/1\^/1"

Diverrebbe un array di 4 elementi siffatto

Elem01 : 2007
Elem02 : OVE
Elem03 : 1
Elem04 : 1

Ziao

lbenaglia Profilo | Guru

>Io ho questo campo "chiave_tabella" (tipo stringa):
>2007\^/OVE\^/1\^/1
>2007\^/OVE\^/16\^/10
>2007\^/OVE\^/162\^/100
>ecc...
>Dovrei ottenere invece quattro campi: anno (2007), protocollo(OVE),
>numero (16), riga (2)
>risultato finale: 2007 OVE 16 2

Ciao Marco,

se utilizzi SQL Server 2005 puoi servirti di due novità introdotte con questa versione: gli operatori CROSS APPLY e PIVOT.
CROSS APPLY permette di mettere in JOIN una tabella ed una funzione parametrica table-level valorizzando tali parametri con le colonne della tabella.
PIVOT ti permette di eseguire query cross-tab.

Guarda il seguente esempio:

USE tempdb; CREATE TABLE dbo.myTable( chiave_tabella varchar(25) NOT NULL ); INSERT dbo.myTable VALUES('2007\^/OVE\^/1\^/1'); INSERT dbo.myTable VALUES('2007\^/OVE\^/16\^/10'); INSERT dbo.myTable VALUES('2007\^/OVE\^/162\^/100'); GO CREATE FUNCTION dbo.ufn_Split( @Expression varchar(25), @Delimiter varchar(3) ) RETURNS @Table TABLE( ID tinyint NOT NULL, Items varchar(10) NOT NULL ) AS BEGIN DECLARE @Start int DECLARE @End int DECLARE @Item varchar(10) DECLARE @ID tinyint SET @Start = 1 SET @ID = 1 WHILE(@Start <= LEN(@Expression)) BEGIN SET @End = CHARINDEX(@Delimiter, @Expression, @Start) IF @End = 0 SET @End = DATALENGTH(@Expression) + 1 SET @Item = SUBSTRING(@Expression, @Start, @End - @Start) INSERT @Table VALUES(@ID, @Item) SET @Start = @End + DATALENGTH(@Delimiter) SET @ID = @ID + 1 END RETURN END; GO SELECT chiave_tabella , [1] AS Anno , [2] AS Protocollo , [3] AS Numero , [4] AS Riga FROM ( SELECT T.*, S.* FROM dbo.myTable AS T CROSS APPLY dbo.ufn_Split(chiave_tabella, '\^/') AS S ) AS Q PIVOT ( MAX(Items) FOR ID IN ([1], [2], [3], [4]) ) AS PivotTable; /* Output: chiave_tabella Anno Protocollo Numero Riga ------------------------- ---------- ---------- ---------- ---------- 2007\^/OVE\^/1\^/1 2007 OVE 1 1 2007\^/OVE\^/16\^/10 2007 OVE 16 10 2007\^/OVE\^/162\^/100 2007 OVE 162 100 (3 row(s) affected) */ DROP FUNCTION dbo.ufn_Split; DROP TABLE dbo.myTable;

Come vedi ho scritto una funzione che esegue lo split della riga, la metto in JOIN con la tabella ed eseguo la conversione delle righe in colonne.
Per ulteriori dettagli consulta i Books Online.

>Grazie a tutti per l'aiuto.
Prego.

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

marko80 Profilo | Junior Member

Scusate il ritardo, ma ho avuto altre urgenze.
Vi ringrazio per le risposte, ma essendo agli inizi mi risulta un po complicato da capire o mi sono spiegato male io.
Io ho gia una tabella contenente il campo "chiave_tabella" (2007\^/OVE\^/1\^/1, 2007\^/OVE\^/16\^/10, 2007\^/OVE\^/162\^/100, ecc.) e altri campi...
Quello che sto cercando di fare è creare una VISTA per estrapolare da questa tabella quattro campi che mi restituiscano anno: 2007, protocollo: OVE, numero: 16, riga:1
Se mi fate degli esempi forse mi viene più facile.
Grazie a tutti

AndreaKpr Profilo | Senior Member


Se ti serve ua vista direttamente in Sql

Conviene che sfrutti l'esempio di "lbenaglia", fa al caso tuo.
Con una Vista non so se riesci, ma di sicuro una store procedure o una function ottengono il risulatato che cerchi.

lbenaglia Profilo | Guru

>Io ho gia una tabella contenente il campo "chiave_tabella" (2007\^/OVE\^/1\^/1,
>2007\^/OVE\^/16\^/10, 2007\^/OVE\^/162\^/100, ecc.) e altri campi...
>Quello che sto cercando di fare è creare una VISTA per estrapolare
>da questa tabella quattro campi che mi restituiscano anno: 2007,
>protocollo: OVE, numero: 16, riga:1
>Se mi fate degli esempi forse mi viene più facile.

La vista puoi costruirla sull'ultima query che trovi nel mio esempio...

>Grazie a tutti
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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