1 messaggio dal 19 luglio 2011
Salve,
sono nuova spero di non domandare qualcosa che gia' esiste.

Sto lavorando da poco con l'xml e ho questa necessita':
Da un file xml sto caricando due tabelle una madre e una figlie (master-detail).
Il problema mi si pone quando carico la figlia e devo generare una sequenza -progressivo all'interno alla chiave.

Es:
INSERT INTO figlia
SELECT *
FROM OPENXML (@idoc, '.../..'',2)
WITH (Codice nvarchar(8) '.',
Id nvarchar(16) '.' ,
riga nvarchar(10) '.'
)

La tabella figlia ha le seguenti colonne:
CODICE (Key)
ID (K)
RIGA (K)
SEQUENZA

La colonna sequenza si deve azzerare al cambio della chiave.

Ho provato a mettere Identity alla SEQUENZA ma non sono sicura che dopo l'ordine (che è importante) sia corretto. Ho provato con una variabile ma non sono riuscita a inserirla nella insert.

Grazie
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
se ho ben compreso la tua esigenza, la colonna "Sequenza" deve avere un numero ordinale progressivo che venga resettato ad ogni cambio di partizionamento della colonna "Codice"...
se questo e' il caso, puoi ottenere quel valore utilizzando la funzione di windowing ROW_NUMBER() OVER (PARTITION BY ...)
tecnicamente, userai ad esempio una Common Table Expression per recuperare il contenuto del tuo XML, successivamente utilizzerai la funzione di windowing per popolare il contenuto della colonna Sequenza, ed infine popolerai la tabella figlia con il risultato...
di seguito un triviale esempio...
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE xOPENXML (
  Codice varchar(10),
  Id varchar(10),
  riga varchar(10)
  );
CREATE TABLE dbo.figlia (
  Codice varchar(10),
  Id varchar(10),
  riga varchar(10),
  Sequenza int
  )  
GO
INSERT INTO dbo.xOPENXML
  VALUES ( '1', '1', 'riga1' ),
    ( '2', '2', 'riga2.1' ), ( '2', '3', 'riga2.2' ),
    ( '3', '4', 'riga3.1' ), ( '3', '5', 'riga3.2' ), ( '3', '6', 'riga3.3' );
GO
WITH cteXML AS (
  -- recuperi il tuo rowset dal file XML
  SELECT *
    FROM xOPENXML
  ),
cteIns AS (
  -- ci aggiungi la 'sequenza' per partizione di Codice
  SELECT c.Codice, c.Id, c.riga, ROW_NUMBER() OVER (PARTITION BY c.Codice ORDER BY Id) AS Sequenza
    FROM cteXML c)

INSERT INTO dbo.figlia
  SELECT * FROM cteIns;

SELECT * FROM dbo.figlia;
GO
DROP TABLE dbo.xOPENXML, dbo.figlia;
--<---------
Codice     Id         riga       Sequenza
---------- ---------- ---------- -----------
1          1          riga1      1
2          2          riga2.1    1
2          3          riga2.2    2
3          4          riga3.1    1
3          5          riga3.2    2
3          6          riga3.3    3


saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.