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

LEFT () so với SET TEXTSIZE trong SQL Server:Sự khác biệt là gì?

Có thể bạn đã quen với SET TEXTSIZE trong SQL Server, cho phép bạn giới hạn số lượng dữ liệu được trả về trong SELECT truy vấn.

Có lẽ bạn nhận thấy rằng kết quả của nó giống hệt như LEFT() khi chạy một truy vấn cụ thể. Điều nào đặt ra câu hỏi:Có sự khác biệt giữa hai lựa chọn này không?

Chắc chắn có sự khác biệt giữa hai tùy chọn này. Có những trường hợp cả hai hàm sẽ trả về kết quả hoàn toàn khác nhau. Và cũng có sự khác biệt về cách chúng hoạt động, cũng như loại dữ liệu mà chúng có thể được sử dụng.

Định nghĩa

Hãy bắt đầu bằng cách xem mỗi cái làm gì.

LEFT()
Trả về phần bên trái của chuỗi ký tự với số ký tự được chỉ định.
SET TEXTSIZE
Chỉ định kích thước của varchar (max) , nvarchar (tối đa) , varbinary (max) , văn bản , ntext hình ảnh dữ liệu được trả về bởi một SELECT tuyên bố.

Hãy kiểm tra chi tiết điều này.

Ký tự so với Kích thước dữ liệu

Chú ý đến từ ngữ của mỗi định nghĩa. Cụ thể là các từ “ký tự” so với “kích thước” và “dữ liệu”.

  • LEFT() cho phép bạn nêu rõ có bao nhiêu ký tự được trả lại.
  • SET TEXTSIZE cho phép bạn chỉ định kích thước dữ liệu được trả về.

Đây là một điểm khác biệt quan trọng cần thực hiện vì bạn sẽ nhận được các kết quả khác nhau tùy thuộc vào loại dữ liệu. Các ký tự khác nhau có thể yêu cầu kích thước lưu trữ khác nhau. Một ký tự có thể sử dụng 1 byte và ký tự khác có thể sử dụng 2 byte.

Sử dụng LEFT() sẽ cho phép bạn chỉ định số lượng ký tự, bất kể chúng sử dụng bao nhiêu byte.

SET TEXTSIZE mặt khác, cho phép bạn chỉ định số lượng byte để quay lại - không các ký tự số.

Nếu dữ liệu được lưu trữ bằng nvarchar (max) ví dụ:bạn có thể thấy rằng SET TEXTSIZE trả về một nửa số ký tự LEFT() làm.

Ví dụ:

 TẠO BẢNG TextSizeTest (varchar50 varchar (50), varcharMax varchar (max), nvarcharMax nvarchar (max)); CHÈN VÀO TextSizeTestVALUES ('Dragonfruit', 'Dragonfruit', 'Dragonfruit'); ĐẶT TEXTSIZE 50; CHỌN TRÁI (varchar50, 4) AS varchar50, LEFT (varcharMax, 4) AS varcharMax, LEFT (nvarcharMax, 4) AS nvarcharMaxFROM TextSize SET TEXTSIZE 4; CHỌN * TỪ TextSizeTest; 

Kết quả:

 + ------------- + -------------- + --------------- + | varchar50 | varcharMax | nvarcharMax || ------------- + -------------- + --------------- || Kéo | Kéo | Kéo | + ------------- + -------------- + --------------- + (1 hàng bị ảnh hưởng) Các lệnh đã hoàn tất thành công. + ------------- + -------------- + ------------- - + | varchar50 | varcharMax | nvarcharMax || ------------- + -------------- + --------------- || Quả thanh long | Kéo | Dr | + ------------- + -------------- + --------------- + (1 hàng bị ảnh hưởng) 

Kết quả đầu tiên là cho LEFT() . Nó hoạt động trên cả ba loại và kích thước dữ liệu. Nó trả về số ký tự chính xác được chỉ định.

Kết quả thứ hai là cho SET TEXTSIZE . Nó không ảnh hưởng đến varchar (50) các kết quả. Nó chỉ ảnh hưởng đến hai cái còn lại. Nhưng nó ảnh hưởng đến họ khác nhau. Đối với varchar (max) , mỗi ký tự sử dụng 1 byte và do đó chúng tôi nhận được cùng một số ký tự được trả về như TEXTSIZE được chỉ định . Đối với nvarchar (tối đa) đó là một câu chuyện khác. Mỗi ký tự sử dụng 2 byte và do đó chúng tôi chỉ nhận được một nửa số ký tự được trả về.

Tuy nhiên, kết quả trả về bởi LEFT() vẫn có thể bị ảnh hưởng bởi SET TEXTSIZE . Nếu tôi chạy LEFT() truy vấn lại, nhưng đặt trước nó bằng SET TEXTSIZE 2 , chúng tôi nhận được điều này:

 SET TEXTSIZE 2; CHỌN TRÁI (varchar50, 4) AS varchar50, LEFT (varcharMax, 4) AS varcharMax, LEFT (nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest; 

Kết quả:

 + ------------- + -------------- + --------------- + | varchar50 | varcharMax | nvarcharMax || ------------- + -------------- + --------------- || Kéo | Tiến sĩ | D | + ------------- + -------------- + --------------- +  

Kích thước dữ liệu tối đa so với Kích thước dữ liệu cố định

Một điểm khác biệt nữa là SET TEXTSIZE chỉ hoạt động trên varchar (max) , nvarchar (tối đa) , varbinary (max) , văn bản , ntext hình ảnh dữ liệu. Lưu ý max phần. Nếu bạn sử dụng kích thước dữ liệu cố định (chẳng hạn như varchar(255) ví dụ), SET TEXTSIZE sẽ không hoạt động.

LEFT() mặt khác, hoạt động với tất cả dữ liệu ký tự ngoại trừ văn bản ntext .

Bạn có thể thấy những khác biệt này trong ví dụ trước. varchar (50) dữ liệu bị ảnh hưởng bởi LEFT() nhưng không phải SET TEXTSIZE .

LEFT () cụ thể hơn

Một sự khác biệt nữa là LEFT() chỉ được áp dụng cho cột (hoặc hằng số hoặc biến) mà bạn chỉ định. Nếu bạn muốn áp dụng nó cho nhiều cột / biểu thức, bạn cần bao gồm lại nó cho mỗi biểu thức. Tương tự với các truy vấn tiếp theo.

SET TEXTSIZE mặt khác, được áp dụng cho tất cả các cột áp dụng được trả về trong truy vấn. Nó cũng được áp dụng cho tất cả các truy vấn cho đến khi nó được đặt thành một giá trị khác.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thay đổi nhiều cột cùng một lúc trong SQL Server

  2. Cài đặt Azure Data Studio trên Ubuntu 18.04

  3. Tổng quan về câu lệnh PRINT trong SQL Server

  4. IDENTITY () so với IDENTITY () trong SQL Server:Sự khác biệt là gì?

  5. Thủ thuật nhanh và tốt nhất để khôi phục tệp SQL Server MDF