Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server âm thầm cắt bớt varchar trong các thủ tục được lưu trữ

Nó chỉ .

Mặc dù vậy, tôi chưa bao giờ nhận thấy vấn đề vì một trong những kiểm tra của tôi là để đảm bảo các thông số của tôi khớp với độ dài cột trong bảng của tôi. Trong mã khách hàng cũng vậy. Cá nhân tôi mong rằng SQL sẽ không bao giờ thấy dữ liệu quá dài. Nếu tôi nhìn thấy dữ liệu bị cắt ngắn, thì rõ ràng là điều gì đã gây ra nó.

Nếu bạn cảm thấy cần phải có varchar (max), hãy cẩn thận với vấn đề hiệu suất lớn vì ưu tiên kiểu dữ liệu. varchar (max) có mức độ ưu tiên cao hơn varchar (n) (dài nhất là cao nhất). Vì vậy, trong loại truy vấn này, bạn sẽ nhận được một lượt quét chứ không phải tìm kiếm và mọi giá trị varchar (100) là CAST thành varchar (max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Chỉnh sửa:

Có một mục Microsoft Connect đang mở liên quan đến vấn đề này.

Và nó có lẽ xứng đáng được đưa vào cài đặt Nghiêm ngặt của Erland Sommarkog (và phù hợp với mục Kết nối).

Chỉnh sửa 2, sau khi Martins nhận xét:

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. trả về giá trị tại một vị trí từ STRING_SPLIT trong SQL Server 2016

  2. Truy vấn SQL để chia dữ liệu cột thành các hàng

  3. SQL:tìm kiếm một chuỗi trong mỗi cột varchar trong cơ sở dữ liệu

  4. Tại sao CTE lại tốt hơn con trỏ / bảng dẫn xuất / truy vấn con / bảng tạm thời, v.v.?

  5. Truy vấn SQL để chọn một chuỗi giữa hai chuỗi đã biết