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.