sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server trunkerer lydløst varchar'er i lagrede procedurer

Det er bare .

Jeg har dog aldrig bemærket et problem, fordi en af ​​mine kontroller ville være at sikre, at mine parametre matcher mine tabelkolonnelængder. Også i klientkoden. Personligt ville jeg forvente, at SQL aldrig ser data, der er for lange. Hvis jeg så trunkerede data, ville det være tydeligt, hvad der forårsagede det.

Hvis du føler behovet for varchar(max), pas på et massivt præstationsproblem på grund af datatypeforrang. varchar(max) har højere forrang end varchar(n) (længst er højest). Så i denne type forespørgsel får du en scanning og ikke en søgning, og hver varchar(100) værdi er CAST til varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Rediger:

Der er et åbent Microsoft Connect-emne vedrørende dette problem.

Og det er nok værd at inkludere i Erland Sommarkogs strenge indstillinger (og matchende Connect-element).

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. Sådan udføres kun en trigger, når en specifik kolonne er opdateret (SQL-server)

  2. Er det muligt at henvise til en kolonne som flere fremmednøgler?

  3. Inkludering af tabeller og skemaer, når du angiver identitetskolonnerne i en SQL Server-database

  4. SQL Self Join