Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server безшумно съкращава varchar в съхранените процедури

Просто е .

Никога не съм забелязал проблем обаче, защото една от моите проверки би била да гарантирам, че параметрите ми съвпадат с дължината на колоните ми в таблицата. В клиентския код също. Лично аз очаквам SQL никога да не вижда твърде дълги данни. Ако видях съкратени данни, щеше да е очевидно причината за това.

Ако усетите нуждата от varchar(max), пазете се от огромен проблем с производителността поради предимство на типа данни. varchar(max) има по-висок приоритет от varchar(n) (най-дългият е най-висок). Така че при този тип заявка ще получите сканиране, а не търсене и всяка стойност на varchar(100) е CAST към varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Редактиране:

Има отворен елемент на Microsoft Connect относно този проблем.

И вероятно си заслужава да бъде включен в строгите настройки на Erland Sommarkog (и съответстващ елемент на Connect).

Редактиране 2, след коментар на Мартинс:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извикване на API от съхранената процедура на SQL Server

  2. Стойността на колоната за идентичност изведнъж скача до 1001 в sql сървъра

  3. SQLServer срещу StateServer за производителност на състоянието на сесията на ASP.NET

  4. Преобразуването на тип данни datetime2 в тип данни datetime води до стойност извън диапазона

  5. Възможно ли е да се зададе схема по подразбиране от низ за връзка?