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

SQL Server tiše zkrátí varchar v uložených procedurách

Prostě je .

Nikdy jsem si však nevšiml problému, protože jednou z mých kontrol by bylo zajistit, aby mé parametry odpovídaly délkám sloupců tabulky. I v kódu klienta. Osobně bych očekával, že SQL nikdy neuvidí data, která jsou příliš dlouhá. Pokud bych viděl zkrácená data, bylo by zjevné, co to způsobilo.

Pokud máte pocit, že potřebujete varchar(max), dejte si pozor na masivní problém s výkonem kvůli prioritě datových typů. varchar(max) má vyšší prioritu než varchar(n) (nejdelší je nejvyšší). Takže v tomto typu dotazu získáte sken, ne hledání a každá hodnota varchar(100) je CAST na varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Upravit:

Existuje otevřená položka Microsoft Connect týkající se tohoto problému.

A pravděpodobně si to zaslouží zahrnutí do Strict nastavení Erlanda Sommarkoga (a odpovídající položky Connect).

Upravit 2 po Martinově komentáři:

DECLARE @sql VARCHAR(MAX), @nsql nVARCHAR(MAX);
SELECT @sql = 'B', @nsql = 'B'; 
SELECT 
   LEN(@sql), 
   LEN(@nsql), 
   DATALENGTH(@sql), 
   DATALENGTH(@nsql)
;

DECLARE @t table(c varchar(8000));
INSERT INTO @t values (replicate('A', 7500));

SELECT LEN(c) from @t;
SELECT 
   LEN(@sql + c), 
   LEN(@nsql + c), 
   DATALENGTH(@sql + c), 
   DATALENGTH(@nsql + c) 
FROM @t;


  1. Jak výkonný je váš uzel ProxySQL?

  2. Potíže s velkými daty:Hardware nebo software… Spotřebiče…

  3. Jak získat informace o chybě kompilace v Oracle/TOAD

  4. Vraťte seznam databází v SQLite