2013-08-26 18 views
6

Mam tabelę, która przechowuje dynamicznie konstruowane zapytania T SQL w jednej z kolumn tabeli. Moim wymaganiem jest to, że muszę wykonać utworzone zapytanie (w moim przypadku niektóre instrukcje wstawiania) i I 'nie chcę używać pętli while' do przechodzenia przez całe wiersze, a następnie wykonywania instrukcji ze zmiennej. Również Nie chcę używać kursora. Tabela zawiera około 5 milionów dynamicznie formułowanych instrukcji wstawiania instrukcji SQL. Wcześniej próbowałem tego przy użyciu pętli while, ale ukończenie trwało kilka dni, więc upuściłem go.Wykonaj dynamiczną instrukcję SQL przechowywaną w kolumnie tabeli

+1

Wykonanie 5 milionów instrukcji 'INSERT' zajmie trochę czasu. Czy podejście oparte na zestawie nie jest możliwe? –

+1

Masz okropny projekt modelu danych i przemyślane rozwiązanie problemu. – SQLMason

+0

Pokaż nam przykłady tych danych. Jest to bardzo zły projekt i niezwykle trudny do rozwiązania w sposób, który dobrze się sprawdza. Waszą największą nadzieją jest to, że większość tych danych można zredukować do czegoś bardziej relacyjnego. – RBarryYoung

Odpowiedz

4

Gdyby patrzeć co `lakh” było :)

Jak wspomniano inne komentarze nie jest to najbardziej optymalne podejście do DML, należy rozważyć refaktoryzacji. Jak to można połączyć dynamicznego SQL w partiach, np .:

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) 

W ten sposób można połączyć kontrolowaną ilość INSERT w ramach jednej transakcji. Możesz kontrolować liczbę insertów za pomocą instrukcji WHERE (np. WHERE ID BETWEEN 1 and 100, aby wykonać 100 INSERTów na raz) Możesz zapętlić ten warunek (pętla yes, ale nie będzie pętli przez poszczególne wiersze, ale przez warunki zamiast eg1 - 100, 101 - 200, 201 - 300 itd.).

+0

Dziękuję za odpowiedź. Próbowałem również tej metody. Głównym problemem, jaki mi się zdarzył, była niespójność limitu varchar (max), gdy testowałem go na różnych komputerach. Może coś związanego z kodowaniem znaków. – Dibin

+0

Nvarchar (max) limit id 2Gb, technicznie powinno wystarczyć. W jaki sposób możesz próbować uruchamiać oświadczenia w tym samym czasie? –

+0

Możesz połączyć się w swoim exec, aby wyjść poza maksimum. 'exec (@ sSQL + @ sSQL1 + @ sSQL2)' – SQLMason

Powiązane problemy