Nie ma znaczenia ciężko kodowane granica (65536 * Network Packet Rozmiar 4KB jest 268 MB a długość skrypt jest dalekie od tego), choć nie zaleca się stosowania tej metody dla dużej ilości wierszy.
Wyświetlany błąd jest zgłaszany przez narzędzia klienta, a nie SQL Server. Jeśli zbudować ciąg SQL w dynamicznym SQL kompilacji jest w stanie przynajmniej zacząć skutecznie
DECLARE @SQL NVARCHAR(MAX) = '(100,200,300),
';
SELECT @SQL = 'SELECT * FROM (VALUES ' + REPLICATE(@SQL, 1000000) + '
(100,200,300)) tc (proj_d, period_sid, val)';
SELECT @SQL AS [processing-instruction(x)]
FOR XML PATH('')
SELECT DATALENGTH(@SQL)/1048576.0 AS [Length in MB] --30.517705917
EXEC(@SQL);
Choć Zabiłem wyżej po ~ 30 minut czasu kompilacji i nadal nie przyniosły wiersz. Dosłowne wartości muszą być przechowywane wewnątrz samego planu jako tabela stałych, a SQL Server wydaje a lot of time próbując wyprowadzić o nich również właściwości.
SSMS jest aplikacją 32-bitową i rzuca std::bad_alloc
wyjątek podczas analizowania partii
Próbuje wcisnąć element na wektorze znak, że osiągnął zdolność i jego próba zmiany rozmiaru nie z powodu do niedostępności wystarczająco dużego, ciągłego obszaru pamięci. Tak więc oświadczenie nigdy nie prowadzi nawet do serwera.
Pojemność wektorowa rośnie o 50% za każdym razem (tj. Po the sequence here). Zdolność do wzrostu wektora zależy od sposobu ułożenia kodu.
następujące potrzeby wzrastać z pojemności od 19 do 28
SELECT * FROM
(VALUES
(100,200,300),
(100,200,300),
(100,200,300),
(100,200,300),
(100,200,300),
(100,200,300)) tc (proj_d, period_sid, val)
i dodaje wymaga jedynie rozmiar 2
SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)
Poniżej wymaga zdolności> 63 i < = 94.
SELECT *
FROM (VALUES
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300)
) tc (proj_d, period_sid, val)
Dla miliona rzędów jak w przypadku 1 pojemność wektora musi wzrosnąć do 3.543,306.
Może się zdarzyć, że jedna z poniższych czynności umożliwi parsowanie strony po stronie klienta.
- Zmniejsz liczbę podziałów linii.
- Restart SSMS w nadziei, że żądanie dużej ciągłej pamięci powiedzie się, gdy jest mniej fragmentacji przestrzeni adresowej.
Jednak nawet jeśli z sukcesem wyślesz go na serwer, to ostatecznie zabije serwer podczas generowania planu wykonawczego, tak jak to omówiono powyżej.
Będziesz znacznie lepiej korzystał z kreatora importu eksportu, aby załadować tabelę. Jeśli musisz to zrobić w TSQL, znajdziesz rozbicie go na mniejsze partie i/lub użycie innej metody, takiej jak shredowanie XML będzie działać lepiej niż Table Valued Constructors. Poniższe czynności wykonuję na przykład w ciągu 13 sekund na moim komputerze (chociaż jeśli korzystasz z SSMS, prawdopodobnie będziesz musiał rozpaść się na kilka partii zamiast wklejać ogromny łańcuch literowy XML).
DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ;
DECLARE @Xml XML = REPLICATE(@S,1000000);
SELECT
x.value('@proj_d','int'),
x.value('@period_sid','int'),
x.value('@val','int')
FROM @Xml.nodes('/x') c(x)
Sprawdź ten link: http://stackoverflow.com/questions/14790548/updating-4-million-records-in-sql-server-using-list-of-record-ids-as-input – Laxmi
Wszystkie wartości literalne należy wkompilować w plan wykonania. Ile czasu zajmuje kompilacja zanim pojawi się błąd? –
@MartinSmith - Mniej niż 5 sekund zawsze –