sql >> Databáze >  >> RDS >> Sqlserver

Maximální velikost proměnné varchar(max).

Pokud mohu říci, v roce 2008 neexistuje žádná horní hranice.

V SQL Server 2005 kód ve vaší otázce selže při přiřazení k @GGMMsg proměnná s

Pokus o zvětšení LOB nad maximální povolenou velikost 2 147 483 647 bajtů.

níže uvedený kód selže s

REPLICATE:Délka výsledku překračuje limit délky (2 GB) cílového velkého typu.

Zdá se však, že tato omezení byla v tichosti zrušena. V roce 2008

DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681); 

SET @y = REPLICATE(@y,92681);

SELECT LEN(@y) 

Vrátí

8589767761

Spustil jsem to na svém 32bitovém stolním počítači, takže tento 8GB řetězec je mnohem více než adresovatelná paměť

Spuštěno

select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid

Vráceno

internal_objects_alloc_page_co 
------------------------------ 
2144456    

takže předpokládám, že se to všechno uloží do LOB stránky v tempdb bez ověření délky. Nárůst počtu stránek byl spojen s SET @y = REPLICATE(@y,92681); prohlášení. Počáteční přiřazení proměnné k @y a LEN výpočet to nezvýšil.

Důvodem pro zmínku je to, že počet stránek je mnohem větší, než jsem očekával. Za předpokladu 8KB stránky to vyjde na 16,36 GB, což je samozřejmě víceméně dvojnásobek toho, co se zdá být nutné. Domnívám se, že je to pravděpodobně způsobeno neefektivitou operace zřetězení řetězců, která potřebuje zkopírovat celý obrovský řetězec a přidat kus na konec, místo aby bylo možné přidat na konec existujícího řetězce. Bohužel v tuto chvíli .WRITE metoda není podporována pro proměnné varchar(max).

Přidání

Také jsem testoval chování se zřetězením nvarchar(max) + nvarchar(max) a nvarchar(max) + varchar(max) . Oba tyto umožňují překročení limitu 2 GB. Pokus o uložení výsledků do tabulky však selže s chybovou zprávou Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes. znovu. Skript pro to je níže (spuštění může trvat dlouho).

DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647); 
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1)  /*4294967294, 4294967292*/


DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823); 
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2)  /*2147483646, 4294967292*/


DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3)   /*6442450940, 12884901880*/

/*This attempt fails*/
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test


  1. Jak funguje modulo operátor v MariaDB

  2. Instalace MySQL Pythonu na Mac OS X

  3. Jak vybrat všechny záznamy z jedné tabulky, které neexistují v jiné tabulce?

  4. Jak provést UPDATE Pass-Through Query v SQL Server