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 và 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 và 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 và 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ảiSET 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.