Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server dyskretnie obcina wartości varchar w procedurach składowanych

Po prostu jest .

Nigdy jednak nie zauważyłem problemu, ponieważ jednym z moich sprawdzeń byłoby upewnienie się, że moje parametry pasują do długości kolumn tabeli. Również w kodzie klienta. Osobiście spodziewałbym się, że SQL nigdy nie zobaczy zbyt długich danych. Gdybym zobaczył obcięte dane, byłoby oczywiste, co je spowodowało.

Jeśli czujesz potrzebę varchar(max), strzeż się ogromnego problemu z wydajnością ze względu na pierwszeństwo typów danych. varchar(max) ma wyższy priorytet niż varchar(n) (najdłuższy to najwyższy). Więc w tym typie zapytania otrzymasz skanowanie, a nie wyszukiwanie, a każda wartość varchar(100) to CAST do varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Edycja:

Istnieje otwarta pozycja Microsoft Connect dotycząca tego problemu.

I prawdopodobnie warto włączyć go do ustawień ścisłych Erlanda Sommarkog (i pasującego elementu Connect).

Edycja 2, po komentarzu Martina:

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. Konwertuj „smalldatetime” na „date” w SQL Server (przykłady T-SQL)

  2. Wyzwalacze programu SQL Server — część 2 — wyzwalacze DDL i LOGON

  3. 10 wskazówek SP_EXECUTESQL, których należy unikać, aby uzyskać lepszy dynamiczny SQL

  4. SqlConnection.Close() wewnątrz przy użyciu instrukcji

  5. Dlaczego select SCOPE_IDENTITY() zwraca liczbę dziesiętną zamiast liczby całkowitej?