2010-10-15 44 views

Trả lời

338

Quote, tóm tắt từ this article:

  1. SET là tiêu chuẩn ANSI cho giao biến, SELECT thì không.
  2. 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.
  3. 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ố đó)
  4. 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ó)
  5. 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.
+3

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" –

+11

@AlexKuznetsov: Câu sau đó nói chính xác điều đó. –

+1

@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. –

121

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' */ 
+4

+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 –

+4

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

+4

@Zack Bạn đã hoàn toàn bỏ lỡ điểm của ví dụ. –

16

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*/ 
+0

rất đẹp, gọn gàng – SimplyInk

Các vấn đề liên quan