SQL sorgusundan değişken nasıl ayarlanır?


324

Bir SQL sorgusu bir değişken ayarlamak çalışıyorum:

declare @ModelID uniqueidentifer

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

Açıkçası ben işe yaramadığı için bunu doğru yapmıyorum. Birisi bir çözüm önerebilir mi?

Teşekkürler!



2
Bu benzersiz bir tanımlayıcıdır. Benzersiz değil.
DxTx

Yanıtlar:


518

SELECT kullanarak:

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

SET kullanarak:

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

TSQL'de SELECT ve SET kullanma arasındaki fark için bu soruya bakın .

Uyarı

Bu select deyimi birden fazla değer döndürürse (başlamak kötü):

  • Kullanırken SELECT, değişkene herhangi bir hata veya uyarı olmaksızın döndürülen son değer (womp'un söylediği gibi) atanır (bu, mantık hatalarına neden olabilir)
  • Kullanırken SETbir hata oluşacaktır

3
Bu select deyimi birden çok değer döndürürse: ilk durumda, değişkene herhangi bir hata veya uyarı olmadan döndürülen (womp'un dediği gibi) son değer atanır (bu, mantık hatalarına neden olabilir); ikinci durumda bir hata oluşacaktır.
Francis Niu

3
BTW, SET kullanan davanın bir parantez lazım: SET @ModelID = (SEÇ ...)
Francis Niu

2
TOP 1'i select ile birlikte seçerim, sadece 1 sonuç elde etmek için, örneğin SET @ModelID = (MODELLERDEN ÜST 1 m.modelid'i m mArarid = 'South Coast')
SEÇİN

Birden fazla değer döndürüldüğünde set kullanıldığında, istisna işleme ile nasıl işlenir?
Öğrenci

Bazen sessizce beklenmedik bir sonuç kullanmak yerine beklenmeyen bir yinelenen sonuç varsa bir hata istersiniz.
Denise Skidmore


29
declare @ModelID uniqueidentifer

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

select @ModelID

Hazır olan bu sorunun tekrar cevaplaması gerekmeyen bir cevabı var, seninle Ponilerin cevabı arasında neyin farklı olduğunu bile göremiyorum?
Joshua Duxbury

5
@JoshuaDuxbury çalışan bir kopyala yapıştır sürümü sağlar
greg121

17

Sadece beyan deyiminden ayarlamayı tercih ederim

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

10

TOP 1Sorgu birden çok satır döndürürse kullanın .

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

Aslında SQL'de bir hataya neden olmaz, son kaydı seçer (bu değeri kullanıyorsanız ve yanlış bir uygulamada ortaya çıkan bir hataya neden olabilir)
d219

9

Bunu kullanabilirsiniz, ancak sorgunuzun 1 sonuç verdiğini unutmayın, birden çok sonuç istisnayı atar.

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

Diğer yol:

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

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

Bu durumda, döndürülen iki veya daha fazla sonucunuz varsa, sonucunuz son kayıt olur. Öyleyse, beklenen sonucu göremeyeceğiniz için geri dönen iki kaydınız varsa bunun farkında olun.


4

Üç yaklaşım vardır:

  1. BİLDİRMEK
  2. SET - Microsoft Önerilen yaklaşım
  3. SEÇ

Aşağıdaki sorgu her birinin avantajını ve dezavantajını detaylandırmaktadır:

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

SQL kullanarak değişkenleri ASSIGN için en iyi uygulamayı aşağıda gösterildiği gibi seçin

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

Tek bir satıra birden fazla değişken atamanız gerekiyorsa, aynı SELECT INTO

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

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

--HAPPY CODING-- 

"en iyi uygulama" - kaynak?
Rodney Ellis

Eğer u bir Tablodan seçmek için birden fazla sütun varsa o zaman u tekrar tekrar kodu yerine tek bir SELECT INTO deyimi kullanarak atayabilirsiniz !!
Venkzz_venki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.