วิธีการตั้งค่าตัวแปรจากแบบสอบถาม SQL?


324

ฉันพยายามตั้งค่าตัวแปรจากแบบสอบถาม SQL:

declare @ModelID uniqueidentifer

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

เห็นได้ชัดว่าฉันไม่ได้ทำถูกต้องเพราะไม่ได้ผล ใครบางคนสามารถแนะนำวิธีแก้ปัญหาได้หรือไม่?

ขอบคุณ!



2
มันเป็นเครื่องระบุเอกลักษณ์ ไม่เฉพาะเจาะจง
DxTx

คำตอบ:


518

ใช้ SELECT:

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

ใช้งาน SET:

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

ดูคำถามนี้สำหรับความแตกต่างระหว่างการใช้ SELECT และตั้งอยู่ใน TSQL

คำเตือน

หากคำสั่ง select นี้ส่งคืนค่าหลายค่า (ไม่ดีในการเริ่มต้นด้วย):

  • เมื่อใช้SELECTตัวแปรจะถูกกำหนดให้เป็นค่าสุดท้ายที่ส่งคืน (ตามที่ womp กล่าว) โดยไม่มีข้อผิดพลาดหรือคำเตือนใด ๆ (ซึ่งอาจทำให้เกิดข้อบกพร่องเชิงตรรกะ)
  • เมื่อใช้SETงานจะเกิดข้อผิดพลาด

3
หากคำสั่ง select นี้ส่งคืนค่าหลายค่า: ในกรณีแรกตัวแปรจะถูกกำหนดค่าสุดท้ายที่ส่งคืน (ตามที่ womp กล่าว) โดยไม่มีข้อผิดพลาดหรือคำเตือนใด ๆ (ซึ่งอาจทำให้เกิดข้อบกพร่องเชิงตรรกะ); ในกรณีที่สองจะเกิดข้อผิดพลาด
ฟรานซิส Niu

3
BTW กรณีที่ใช้ SET ต้องการวงเล็บสองอัน: SET @ModelID = (เลือก ... )
ฟรานซิสนียู

2
ฉันจะใช้ TOP 1 กับ select เพื่อให้ได้ผลลัพธ์เพียง 1 รายการเช่น SET @ModelID = (เลือก TOP 1 m.modelid จาก MODELS m WHERE m.areaid = 'South Coast')
TPAKTOPA

ในกรณีที่ใช้ชุดเมื่อคืนค่าหลายค่าแล้ววิธีจัดการโดยใช้การจัดการข้อยกเว้น?
ผู้เรียน

บางครั้งคุณต้องการข้อผิดพลาดหากมีผลลัพธ์ซ้ำซ้อนที่ไม่คาดคิดแทนที่จะใช้ผลลัพธ์ที่ไม่คาดคิดอย่างเงียบ ๆ
เดนิส Skidmore

37
SELECT @ModelID = modelid
FROM Models
WHERE areaid = 'South Coast'

หากข้อความสั่ง select ของคุณส่งคืนค่าหลายค่าตัวแปรของคุณจะถูกกำหนดเป็นค่าสุดท้ายที่ส่งคืน

สำหรับการอ้างอิงเกี่ยวกับการใช้ SELECT พร้อมตัวแปร: http://msdn.microsoft.com/en-us/library/aa259186%28SQL.80%29.aspx


29
declare @ModelID uniqueidentifer

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

select @ModelID

คำถามนี้พร้อมแล้วมีคำตอบที่ไม่จำเป็นต้องตอบอีกฉันไม่เห็นความแตกต่างระหว่างคำตอบของคุณกับ Ponies?
Joshua Duxbury

5
@JoshuaDuxbury ให้บริการรุ่นวางสำเนาที่ใช้งานได้
greg121

17

ฉันชอบเพียงแค่ตั้งค่าจากคำสั่งประกาศ

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

10

ใช้TOP 1ถ้าแบบสอบถามส่งคืนหลายแถว

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

มันจะไม่จริงทำให้เกิดข้อผิดพลาดใน SQL มันจะเลือกระเบียนสุดท้าย (แม้ว่ามันอาจก่อให้เกิดข้อผิดพลาดที่เกิดขึ้นในแอพลิเคชันถ้าคุณกำลังใช้ค่านี้และมันก็เป็นไม่ถูกต้อง)
d219

9

คุณสามารถใช้สิ่งนี้ได้ แต่โปรดจำไว้ว่าคำค้นหาของคุณให้ผลลัพธ์ 1 รายการผลลัพธ์หลายรายการจะมีข้อยกเว้น

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

อีกวิธีหนึ่ง:

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

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

ในกรณีนี้ถ้าคุณมีผลลัพธ์สองรายการขึ้นไปผลลัพธ์ของคุณคือระเบียนสุดท้าย ดังนั้นโปรดระวังสิ่งนี้หากคุณอาจมีการบันทึกอีกสองรายการเนื่องจากคุณอาจไม่เห็นผลลัพธ์ที่คาดหวัง


4

มีสามวิธีคือ

  1. ประกาศ
  2. SET - แนวทางที่ Microsoft แนะนำ
  3. เลือก

รายละเอียดแบบสอบถามด้านล่างนี้มีข้อดีและข้อเสียของแต่ละข้อ:

-- 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 ให้เลือกแนวทางปฏิบัติที่ดีที่สุดดังแสดงด้านล่าง

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

หากคุณต้องกำหนดตัวแปรมากกว่าหนึ่งตัวในหนึ่งบรรทัดคุณสามารถใช้ SELECT INTO เดียวกันนี้ได้

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

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

--HAPPY CODING-- 

"แนวปฏิบัติที่ดีที่สุด" - แหล่งที่มา?
ร็อดนีย์เอลลิส

หากคุณมีคอลัมน์มากกว่าหนึ่งคอลัมน์ให้เลือกจากตารางคุณสามารถกำหนดได้อย่างง่ายดายโดยใช้คำสั่ง SELECT INTO เดียวแทนที่จะทำซ้ำรหัส !!
Venkzz_venki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.