sql >> Database >  >> RDS >> Sqlserver

SQL Server kapt varchar's stil af in opgeslagen procedures

Het is gewoon is .

Ik heb echter nooit een probleem opgemerkt, omdat een van mijn controles zou zijn om ervoor te zorgen dat mijn parameters overeenkomen met de lengtes van mijn tabelkolommen. Ook in de klantcode. Persoonlijk zou ik verwachten dat SQL nooit gegevens ziet die te lang zijn. Als ik afgekapte gegevens zou zien, zou het duidelijk zijn wat de oorzaak was.

Als je varchar(max) toch nodig hebt, pas dan op voor een enorm prestatieprobleem vanwege de prioriteit van het datatype. varchar(max) heeft een hogere prioriteit dan varchar(n) (langste is hoogste). Dus bij dit type zoekopdracht krijg je een scan, geen zoekopdracht en elke varchar(100)-waarde is CAST naar varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Bewerken:

Er is een open Microsoft Connect-item met betrekking tot dit probleem.

En het is waarschijnlijk de moeite waard om te worden opgenomen in de strikte instellingen van Erland Sommarkog (en bijpassend Connect-item).

Edit 2, na de opmerking van Martin:

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. Hash join in Oracle met voorbeeld

  2. Weet u wanneer u opnieuw moet proberen of mislukken bij het aanroepen van SQL Server vanuit C#?

  3. .patch_storage

  4. MySQL-equivalent van DECODE-functie in Oracle