SQLクエリから変数を設定する方法は?


324

SQLクエリから変数を設定しようとしています。

declare @ModelID uniqueidentifer

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

それが機能しないので、明らかに私はこれを正しくしていません。誰かが解決策を提案できますか?

ありがとう!



2
それはuniqueidentifierです。一意ではありません。
DxTx 2018

回答:


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

TSQLでのSELECTとSETの違いについては、この質問を参照してください

警告

このselectステートメントが複数の値を返す場合(そもそも悪い):

  • を使用するSELECTと、変数には、エラーや警告なしに(wompが言ったように)返される最後の値が割り当てられます(これにより、論理バグが発生する可能性があります)。
  • を使用SETするとエラーが発生します

3
このselectステートメントが複数の値を返す場合:最初のケースでは、変数には(wompが言ったように)返された最後の値が割り当てられ、エラーや警告はありません(これにより論理バグが発生する可能性があります)。2番目のケースでは、エラーが発生します。
Francis Niu

3
ところで、SETを使用する場合は、一対の角かっこが必要です。SET@ModelID =(SELECT ...)
Francis Niu

2
SELECT 1を使用して結果を1つだけにするために、TOP 1を使用します。たとえば、SET @ModelID =(SELECT TOP 1 m.modelid FROM MODELS m WHERE m.areaid = 'South Coast')
TPAKTOPA

複数の値が返されるときにsetを使用する場合、例外処理を使用してそれを処理する方法は?
学習者

予期しない結果を静かに使用するのではなく、予期しない重複結果がある場合にエラーが必要になることがあります。
Denise Skidmore、2018年


29
declare @ModelID uniqueidentifer

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

select @ModelID

この質問にはすべて準備ができているので、もう一度答える必要はありませんでした。あなたの答えとポニーの答えの違いがわかりませんか?
Joshua Duxbury 2016

5
@JoshuaDuxburyは、作業コピーの貼り付けバージョンを提供します
greg121


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'

この場合、2つ以上の結果が返されると、結果は最後のレコードになります。したがって、予期した結果が表示されない可能性があるため、さらに2つのレコードが返される場合があることに注意してください。


4

3つのアプローチがあります。

  1. 宣言する
  2. セットするマイクロソフト推奨アプローチ
  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;

1行で複数の変数を割り当てる必要がある場合は、これと同じ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.