Sự khác nhau giữa câu lệnh SET
và SELECT
khi gán biến trong T-SQL là gì?SET so với SELECT khi gán biến?
Trả lời
Quote, tóm tắt từ this article:
- SET là tiêu chuẩn ANSI cho giao biến, SELECT thì không.
- SET chỉ có thể gán một biến cùng một lúc, SELECT có thể thực hiện nhiều bài tập cùng một lúc.
- Nếu gán từ truy vấn, SET chỉ có thể gán giá trị vô hướng. Nếu truy vấn trả về nhiều giá trị/hàng thì SET sẽ tăng lỗi. SELECT sẽ chỉ định một trong các giá trị cho biến và ẩn thực tế là nhiều giá trị được trả lại (vì vậy, bạn có thể không bao giờ biết tại sao có sự cố xảy ra ở nơi khác - vui lòng khắc phục sự cố đó)
- Khi gán từ truy vấn nếu có không có giá trị nào được trả về sau đó SET sẽ gán NULL, trong đó SELECT sẽ không thực hiện gán (vì vậy biến sẽ không bị thay đổi so với giá trị trước đó của nó)
- Theo như chênh lệch tốc độ - không có sự khác biệt trực tiếp giữa SET và SELECT . Tuy nhiên khả năng của SELECT để thực hiện nhiều nhiệm vụ trong một lần chụp sẽ mang lại lợi thế về tốc độ nhẹ so với SET.
Tôi tin SET
là tiêu chuẩn ANSI trong khi SELECT
thì không. Cũng lưu ý hành vi khác nhau của SET
so với SELECT
trong ví dụ bên dưới khi không tìm thấy giá trị.
declare @var varchar(20)
set @var = 'Joe'
set @var = (select name from master.sys.tables where name = 'qwerty')
select @var /* @var is now NULL */
set @var = 'Joe'
select @var = name from master.sys.tables where name = 'qwerty'
select @var /* @var is still equal to 'Joe' */
+1 Tốt hơn nên chạy một lần để hiểu, kiểm tra, chơi, ghi nhớ để chỉ đọc nhưng các câu trả lời khác chỉ là văn bản –
Nếu bạn thực sự sử dụng 'select @var = (chọn tên từ master.sys.tables trong đó tên = 'qwerty') 'bạn sẽ nhận được @var là null. Ví dụ bạn đang đưa ra không phải là cùng một truy vấn. – Zack
@Zack Bạn đã hoàn toàn bỏ lỡ điểm của ví dụ. –
Khi viết các truy vấn, sự khác biệt này nên được giữ trong tâm trí:
DECLARE @A INT = 2
SELECT @A = TBL.A
FROM (SELECT 1 A) TBL
WHERE 1 = 2
SELECT @A
/* @A is 2*/
---------------------------------------------------------------
DECLARE @A INT = 2
SET @A = (
SELECT TBL.A
FROM (SELECT 1 A) TBL
WHERE 1 = 2
)
SELECT @A
/* @A is null*/
rất đẹp, gọn gàng – SimplyInk
- 1. SET so với CHỌN - Sự khác biệt là gì?
- 2. SET một biến trong câu lệnh SELECT - MySQL
- 3. fmt Gán: sản lượng formatDate để ac: set biến
- 4. SELECT Statement - NOLOCK với SET TRANSACTION ISOLATION LEVEL READ COMMITTED
- 5. Câu lệnh SELECT gán giá trị cho biến không được kết hợp với thao tác truy xuất dữ liệu
- 6. Có cần gán một chuỗi cho một biến trước khi so sánh nó với một biến khác không?
- 7. Sass - Gán biến với một biến khác
- 8. Máy chủ SQL: OPENXML so với SELECT..FROM khi giao dịch với XML?
- 9. SQL SELECT đa cột VÀO đa biến
- 10. Gán giá trị bên trong LINQ Select?
- 11. Kiểm tra nếu biến null trước khi gán cho null?
- 12. SQL Server 'select * vào' so 'chèn vào ..select *
- 13. Tại sao gán giá trị cho chuỗi trước khi so sánh, khi mặc định là null
- 14. Biến tĩnh so với Biến động
- 15. SELECT với biến truy vấn không sử dụng INDEXes
- 16. dấu + = điều hành trên Set bất biến
- 17. Gán kết quả hàm cho biến SQL và hiển thị
- 18. Bảng điều khiển JavaScript in giá trị được gán của biến trước khi nó được gán?
- 19. PHP Gán mảng để biến
- 20. Gán blocktrans cho biến số
- 21. gán toán tử cho biến trong python?
- 22. Rails - Biến cục bộ so với các biến thể hiện
- 23. biến cục bộ được tham chiếu trước khi gán với câu lệnh try và except
- 24. gán biến tham chiếu Python
- 25. So khớp nhóm Ruby Regexp, gán các biến trên 1 dòng
- 26. Gán giá trị với ngày tối đa cho biến
- 27. Gán nội dung cho một biến với include/require_once
- 28. std :: set chọn ít hoặc lớn hơn so sánh tại thời gian chạy
- 29. Đặt hai biến vô hướng trong một câu lệnh SELECT?
- 30. Gán kết quả truy vấn vào biến MySQL
Tôi không downvote, nhưng sau đây là không hoàn toàn chính xác: "Theo như tốc độ khác nhau - không có khác biệt trực tiếp giữa SET và SELECT ". Nếu bạn chỉ định nhiều giá trị trong một đường, có thể nhanh hơn nhiều thông qua các bộ mật mã. Google up "Chỉ định nhiều biến với một SELECT hoạt động nhanh hơn" –
@AlexKuznetsov: Câu sau đó nói chính xác điều đó. –
@OMG Ngựa vằn: Có thể nhanh gấp 10 lần, vì vậy tôi không chắc đó có phải là "lợi thế tốc độ nhỏ" hay không. –