2013-08-26 6 views
6

Ho una tabella che memorizza query T SQL dinamicamente costruite in una delle colonne della tabella. Il mio requisito è che ho bisogno di eseguire la query formata (nel mio caso, alcune istruzioni di inserimento) e I 'non voglio usare un ciclo while' per attraversare l'intera riga e quindi eseguire le istruzioni da una variabile. Anche Non voglio usare un cursore. La tabella contiene circa 5 milioni di istruzioni SQL inserite dinamicamente. In precedenza avevo provato questa cosa usando un ciclo while, ma ci sono voluti giorni per completare, e così l'ho lasciato cadere.Esegui un'istruzione SQL dinamica memorizzata in una colonna di una tabella

+1

L'esecuzione di 5 milioni di istruzioni "INSERT' richiederà un po 'di tempo. Non è possibile un approccio basato su set? –

+1

Hai un orribile design del modello di dati e una soluzione sovradimensionata a un problema. – SQLMason

+0

Mostraci alcuni esempi di questi dati. Questo è un pessimo design ed estremamente difficile da affrontare in un modo che funzioni bene. La tua migliore speranza è che la maggior parte di questi dati possa essere ridotta a qualcosa di più relazionale. – RBarryYoung

risposta

4

dovuto cercare quello che `lakh' stato :)

Come altri commenti citati questo non è l'approccio più ottimale per DML, perche non refactoring. Come è possibile combinare il vostro SQL dinamico in lotti, per es .:

DECLARE @sSQL nvarchar(max) 
SET @sSQL = 'BEGIN TRAN; ' 

SELECT @sSQL = @sSQL + COLUMN_WITH_INSERT_STATEMENT + '; ' 
FROM TABLE 
WHERE [limit number of rows] 

SET @sSQL = @sSQL + 'COMMIT TRAN ' 

EXEC(@sSQL) 

In questo modo è possibile combinare il numero controllato di istruzioni INSERT in una singola transazione. È possibile controllare il numero di inserimenti mediante l'istruzione WHERE (ad esempio WHERE ID BETWEEN 1 and 100 per eseguire 100 INSERT alla volta) È possibile eseguire il ciclo attraverso questa condizione (ciclo sì, ma non verrà eseguito su singole righe, ma con condizioni invece eg1 - 100, 101 - 200, 201 - 300 ecc.).

+0

Grazie per la risposta. Ho provato anche questo metodo. Il problema principale che ho avuto è stata l'incoerenza del limite di varchar (max) durante il test su macchine diverse. Forse, qualcosa a che fare con la codifica dei caratteri. – Dibin

+0

Nvarchar (max) limit id 2Gb, tecnicamente dovrebbe essere sufficiente. In che modo affermazioni stai cercando di correre in una volta? –

+0

È possibile concatenare nel proprio exec per andare oltre il limite massimo. 'exec (@sSQL + @ sSQL1 + @ sSQL2)' – SQLMason

Problemi correlati