Bagaimana cara mengatur variabel dari query SQL?

324

Saya mencoba mengatur variabel dari kueri SQL:

declare @ModelID uniqueidentifer

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

Jelas saya tidak melakukan ini dengan benar karena tidak berfungsi. Adakah yang bisa menyarankan solusi?

Terima kasih!

Tuan Cricket
sumber
2
Ini pengenal unik. Bukan pengenal unik.
DxTx

Jawaban:

519

Menggunakan SELECT:

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

Menggunakan SET:

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

Lihat pertanyaan ini untuk perbedaan antara menggunakan SELECT dan SET dalam TSQL .

Peringatan

Jika pernyataan pilih ini mengembalikan beberapa nilai (buruk untuk memulai):

  • Saat menggunakan SELECT, variabel diberi nilai terakhir yang dikembalikan (seperti yang dikatakan womp), tanpa kesalahan atau peringatan (ini dapat menyebabkan bug logika)
  • Saat menggunakan SET, kesalahan akan terjadi
OMG Ponies
sumber
3
Jika pernyataan pilih ini mengembalikan beberapa nilai: dalam kasus pertama, variabel ditetapkan nilai terakhir yang dikembalikan (seperti yang dikatakan womp), tanpa kesalahan atau peringatan (ini dapat menyebabkan bug logika); dalam kasus kedua, kesalahan akan terjadi.
Francis Niu
3
BTW, kasing yang menggunakan SET membutuhkan sepasang tanda kurung: SET @ModelID = (PILIH ...)
Francis Niu
2
Saya akan menggunakan TOP 1 dengan pilih, hanya memiliki 1 hasil, misalnya SET @ModelID = (PILIH TOP 1 m.modelid DARI MODEL m WHERE m.areaid = 'Pantai Selatan')
TPAKTOPA
Jika menggunakan set ketika beberapa nilai dikembalikan maka bagaimana menanganinya menggunakan penanganan pengecualian?
pelajar
Terkadang Anda menginginkan kesalahan jika ada hasil duplikat yang tidak terduga daripada diam-diam menggunakan hasil yang tidak terduga.
Denise Skidmore
37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

Jika pernyataan pilih Anda mengembalikan beberapa nilai, variabel Anda akan diberi nilai terakhir yang dikembalikan.

Untuk referensi tentang menggunakan SELECT dengan variabel: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx

womp
sumber
29
declare @ModelID uniqueidentifer

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

select @ModelID
greg121
sumber
Pertanyaan ini semua siap memiliki jawaban yang tidak perlu dijawab lagi, saya bahkan tidak bisa melihat apa yang berbeda antara jawaban Anda dan kuda?
Joshua Duxbury
5
@ JoshuaDuxbury menyediakan versi copy paste yang
berfungsi
17

Saya lebih suka mengaturnya dari pernyataan pernyataan

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

Gunakan TOP 1jika kueri mengembalikan beberapa baris.

SELECT TOP 1 @ModelID = m.modelid 
  FROM MODELS m
 WHERE m.areaid = 'South Coast'
manu vijay
sumber
Itu tidak akan benar-benar menyebabkan kesalahan dalam SQL itu akan memilih catatan terakhir (walaupun itu dapat menyebabkan kesalahan yang dihasilkan dalam aplikasi jika Anda menggunakan nilai ini dan itu salah)
d219
9

Anda dapat menggunakan ini, tetapi ingat bahwa kueri Anda memberikan 1 hasil, beberapa hasil akan membuang pengecualian.

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

Cara lain:

Select Top(1)@ModelID = modelid from models where areaid = 'South Coast'
Pranay_Sharma_Ind
sumber
4
Select @ModelID =m.modelid 
From   MODELS m
Where  m.areaid = 'South Coast'

Dalam hal ini jika Anda memiliki dua hasil atau lebih yang dikembalikan maka hasil Anda adalah catatan terakhir. Jadi waspadai ini jika Anda mungkin memiliki dua catatan lagi yang dikembalikan karena Anda mungkin tidak melihat hasil yang diharapkan.

Mohammad Farahani
sumber
4

Ada tiga pendekatan:

  1. MENYATAKAN
  2. SET - Pendekatan yang Disarankan Microsoft
  3. PILIH

Kueri di bawah ini merinci keuntungan dan kerugian masing-masing:

-- 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
Venkataraman R
sumber
1

Untuk ASSIGN variabel menggunakan SQL pilih praktik terbaik adalah seperti yang ditunjukkan di bawah ini

->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;

JIKA Anda harus menetapkan lebih dari satu variabel dalam satu baris, Anda dapat menggunakan SELECT INTO yang sama

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

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

--HAPPY CODING-- 
Venkzz_venki
sumber
"praktik terbaik" - sumber?
Rodney Ellis
JIKA Anda memiliki lebih dari satu kolom untuk dipilih dari Tabel maka Anda dapat dengan mudah menetapkannya menggunakan pernyataan SELECT INTO tunggal alih-alih mengulangi kode !!
Venkzz_venki