2013-06-07 10 views
5

Ecco quello che devo fare:SQL: Aggiornamento tabella da un file di testo

Ho un file di testo che ha 3 colonne: PID, X, Y.

ora ho due tabelle nel mio database:

  • Table 1 contiene 4 colonne: UID, PID, X, Y
  • Table 2 contiene più colonne, quelle richieste che sono UID, X, Y

ho bisogno di aggiornare Table 2 con corrispondenti Valori X e Y.

Penso che possiamo utilizzare BULK INSERT per l'aggiornamento table 1, quindi un po 'di ciclo WHILE o qualcosa del genere.

Ma non riesco a capire la cosa esatta.

+0

Non chiaro: si desidera "BULK INSERIRE" il file di testo in "Table1" e quindi aggiornare "Table2" da quello? O cosa? Inoltre: quali sono i ** tipi di dati ** di quelle colonne? Puoi mostrarci un ** file di testo di esempio **? –

+0

Si prega di citare la versione di SQL Server (è possibile aggiungere un ulteriore tag specifico) – Paul

risposta

8
CREATE PROCEDURE [dbo].[BulkInsert]    
(   
@PID int ,   
@x int,   
@y int,   

)    
AS    
BEGIN    
SET NOCOUNT ON;    

declare @query varchar(max)    


CREATE TABLE #TEMP    
(   
[PID] [int] NOT NULL ,   
[x] int NOT NULL,   
[y] int NOT NULL,    

)    


SET @query = 'BULK INSERT #TEMP FROM ''' + PathOfYourTextFile + ''' WITH (FIELDTERMINATOR = '','',ROWTERMINATOR = ''\n'')'    
--print @query    
--return    
execute(@query)    


BEGIN TRAN;    

MERGE TableName AS Target    
USING (SELECT * FROM #TEMP) AS Source    
ON (Target.YourTableId = Source.YourTextFileFieldId) 
-- In the above line we are checking if the particular row exists in the table(Table1) then update the Table1 if not then insert the new row in Table-1.   

WHEN MATCHED THEN    
UPDATE SET    
Target.PID= Source.PID, Target.x= Source.x, Target.y= Source.y   
WHEN NOT MATCHED BY TARGET THEN    

-- Insert statement 

è possibile utilizzare questo approccio di cui sopra per risolvere il vostro problema. Spero che questo ti aiuti. :)

+0

Vorrei avere parole per ringraziarti ... – Spandan

+0

È abbastanza per me ... :) –

2

Come hai intenzione di eseguirlo? Da una procedura memorizzata?

Per risparmiare un po 'le prestazioni, avrei fatto BULK INSERT alla tabella temporanea, quindi inserire da tabella temporanea alla Tabella 1 & 2.

Dovrebbe assomigliare a questa

INSERT INTO Table1 (PID, X, Y) 
SELECT PID, X, Y 
FROM #tempTable 

Alcuni dicono che Temp la tabella non è buona, ma in realtà dipende - se il file è grande, la lettura dal disco richiederà tempo e non si vorrà farlo due volte.

+0

sì modulo un processo memorizzato ... voglio sapere, come si ottiene il passaggio 2, inserire dalla tabella temporanea alla tabella 2? – Spandan

+0

È preferibile caricare prima la tabella 1, quindi caricare la tabella 2 utilizzando la tabella 1 come origine. La Tabella 1 ha il collegamento tra 'uid' e' pid', che è necessario per caricare comunque la Tabella 2. –

1

Non è necessario alcun ciclo per aggiornare la tabella 2; tutto ciò che serve è insert dalla tabella 1.

Oppure, se si sta cercando di aggiornare righe esistenti nella tabella 2, utilizzare una query update che unisce sul tavolo 1. See this question for an example.

Tuttavia, è consigliabile modificare la progettazione del database, in quanto sembra non corretta: si memorizzano X e Y in due posizioni; dovrebbero essere memorizzati solo in una tabella e si dovrebbe partecipare a questa tabella se è necessario utilizzarli in combinazione con altri dati. Se lo facessi, non dovresti preoccuparti di problemi disordinati di mantenere sincronizzate le due tabelle.

Problemi correlati