Làm cách nào để đặt biến từ truy vấn SQL?


324

Tôi đang cố gắng đặt biến từ truy vấn SQL:

declare @ModelID uniqueidentifer

Select @ModelID = select modelid from models
where areaid = 'South Coast'

Rõ ràng là tôi không làm điều này đúng vì nó không hoạt động. Ai đó có thể đề xuất một giải pháp?

Cảm ơn!



2
Đó là định danh duy nhất. Không phải là duy nhất.
DxTx

Câu trả lời:


518

Sử dụng CHỌN:

SELECT @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'

Sử dụng SET:

SET @ModelID = (SELECT m.modelid 
                  FROM MODELS m
                 WHERE m.areaid = 'South Coast')

Xem câu hỏi này để biết sự khác biệt giữa việc sử dụng CHỌN và THIẾT LẬP trong TSQL .

Cảnh báo

Nếu câu lệnh chọn này trả về nhiều giá trị (bắt đầu bằng xấu):

  • Khi sử dụng SELECT, biến được gán giá trị cuối cùng được trả về (như đã nói), không có bất kỳ lỗi hoặc cảnh báo nào (điều này có thể gây ra lỗi logic)
  • Khi sử dụng SET, sẽ xảy ra lỗi

3
Nếu câu lệnh chọn này trả về nhiều giá trị: trong trường hợp đầu tiên, biến được gán giá trị cuối cùng được trả về (như đã nói), không có bất kỳ lỗi hoặc cảnh báo nào (điều này có thể gây ra lỗi logic); trong trường hợp thứ hai, một lỗi sẽ xảy ra.
Francis Niu

3
BTW, trường hợp sử dụng SET cần một cặp dấu ngoặc: SET @ModelID = (CHỌN ...)
Francis Niu

2
Tôi sẽ sử dụng TOP 1 với select, chỉ có 1 kết quả, ví dụ: SET @ModelID = (CHỌN TOP 1 m.modelid TỪ MÔ HÌNH m WHERE m.areaid = 'South Coast')
TPAKTOPA

Trong trường hợp sử dụng set khi trả về nhiều giá trị thì làm thế nào để xử lý nó bằng cách xử lý ngoại lệ?
người học

Đôi khi bạn muốn có lỗi nếu có kết quả trùng lặp không mong muốn thay vì lặng lẽ sử dụng kết quả không mong muốn.
Denise Skidmore


29
declare @ModelID uniqueidentifer

--make sure to use brackets
set @ModelID = (select modelid from models
where areaid = 'South Coast')

select @ModelID

Câu hỏi này đã sẵn sàng có câu trả lời không cần trả lời lại, tôi thậm chí không thể thấy câu trả lời khác nhau giữa câu trả lời của bạn và Ponies là gì?
Joshua Duxbury

5
@JoshuaDuxbury nó cung cấp một phiên bản dán sao chép hoạt động
greg121

17

Tôi thích chỉ đặt nó từ tuyên bố khai báo

DECLARE @ModelID uniqueidentifer = (SELECT modelid 
                                    FROM models
                                    WHERE areaid = 'South Coast')

10

Sử dụng TOP 1nếu truy vấn trả về nhiều hàng.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'

Nó thực sự không gây ra lỗi trong SQL, nó sẽ chọn bản ghi cuối cùng (mặc dù nó có thể gây ra lỗi trong ứng dụng nếu bạn đang sử dụng giá trị này và nó không chính xác)
d219

9

Bạn có thể sử dụng điều này, nhưng hãy nhớ rằng truy vấn của bạn cho 1 kết quả, nhiều kết quả sẽ đưa ra ngoại lệ.

declare @ModelID uniqueidentifer
Set @ModelID = (select Top(1) modelid from models where areaid = 'South Coast')

Cách khác:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'

4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

Trong trường hợp này nếu bạn có hai hoặc nhiều kết quả được trả về thì kết quả của bạn là bản ghi cuối cùng. Vì vậy, hãy lưu ý điều này nếu bạn có thể trả lại hai bản ghi nữa vì bạn có thể không thấy kết quả mong đợi.


4

Có ba cách tiếp cận:

  1. KHAI BÁO
  2. SET - Phương pháp đề xuất của Microsoft
  3. LỰA CHỌN

Dưới đây truy vấn chi tiết ưu điểm và nhược điểm của từng:

-- First way, 
DECLARE @test int = (SELECT 1)
       , @test2 int = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- advantage: declare and set in the same place
-- Disadvantage: can be used only during declaration. cannot be used later

-- Second way
DECLARE @test int  
       , @test2 int 

SET @test = (select 1)
SET @test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: ANSI standard. 
-- Disadvantage: cannot set more than one variable at a time

-- Third way
DECLARE @test int, @test2 int 
SELECT @test = (select 1)
      ,@test2 = (SELECT a from (values (1),(2)) t(a)) -- throws error

-- Advantage: Can set more than one variable at a time
-- Disadvantage: Not ANSI standard

1

Để xác nhận các biến bằng cách sử dụng SQL, hãy chọn cách thực hành tốt nhất như dưới đây

->DECLARE co_id INT ;
->DECLARE sname VARCHAR(10) ;

->SELECT course_id INTO co_id FROM course_details ;
->SELECT student_name INTO sname FROM course_details;

NẾU bạn phải gán nhiều hơn một biến trong một dòng, bạn có thể sử dụng cùng CHỌN VÀO

->DECLARE val1 int;
->DECLARE val2 int;

->SELECT student__id,student_name INTO val1,val2 FROM student_details;

--HAPPY CODING-- 

"thực hành tốt nhất" - nguồn?
Rodney Ellis

NẾU bạn có nhiều hơn một cột để chọn từ Bảng thì bạn có thể dễ dàng gán nó bằng cách sử dụng một câu lệnh CHỌN VÀO thay vì lặp lại mã !!
Venkzz_venki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.