>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