sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server trunkerar tyst varchars i lagrade procedurer

Det är bara är .

Jag har dock aldrig märkt något problem eftersom en av mina kontroller skulle vara att se till att mina parametrar matchar mina tabellkolumner. I klientkoden också. Personligen skulle jag förvänta mig att SQL aldrig skulle se data som är för långa. Om jag såg trunkerade data skulle det vara uppenbart vad som orsakade det.

Om du känner behovet av varchar(max) akta dig för ett massivt prestandaproblem på grund av datatypföreträde. varchar(max) har högre prioritet än varchar(n) (längst är högst). Så i den här typen av fråga får du en skanning, inte en sökning och varje varchar(100)-värde är CAST till varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Redigera:

Det finns ett öppet Microsoft Connect-objekt angående det här problemet.

Och det är förmodligen värt att inkluderas i Erland Sommarkogs strikta inställningar (och matchande Connect-objekt).

Edit 2, efter Martins kommentar:

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. Hur tillåter jag att en rullgardinsparameter i SSRS har ett standardvärde på -- Alla -- ?

  2. Är det möjligt att sammanfoga kolumnvärden till en sträng med CTE?

  3. Få flera värden i SQL Server Cursor

  4. mysql pivotfrågeresultat med GROUP BY