Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server schneidet Varchars in gespeicherten Prozeduren stillschweigend ab

Es ist einfach ist .

Ich habe jedoch nie ein Problem bemerkt, da eine meiner Prüfungen darin bestehen würde, sicherzustellen, dass meine Parameter mit den Längen meiner Tabellenspalten übereinstimmen. Auch im Kundencode. Persönlich würde ich erwarten, dass SQL niemals zu lange Daten sieht. Wenn ich abgeschnittene Daten sehen würde, wäre die Ursache offensichtlich.

Wenn Sie varchar(max) für notwendig halten, achten Sie auf ein massives Leistungsproblem aufgrund des Vorrangs von Datentypen. varchar(max) hat eine höhere Priorität als varchar(n) (am längsten ist am höchsten). Bei dieser Art von Abfrage erhalten Sie also einen Scan, keinen Suchvorgang, und jeder varchar(100)-Wert wird in varchar(max) umgewandelt

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Bearbeiten:

Zu diesem Problem gibt es ein offenes Microsoft Connect-Element.

Und es ist wahrscheinlich würdig, in Erland Sommarkogs strenge Einstellungen (und das passende Verbindungselement) aufgenommen zu werden.

Edit 2, nach 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;