2016-11-08 6 views
0

私は、変数に格納する必要がある単一の結果を期待するたびにSQL Serverは、私が"SELECT TOP 1"は実際に単一の結果を期待したときに単一の結果を得る最良の方法ですか?

をすれば、それはそこに保証されていても文句を言うので、私は

DECLARE @id INT = SELECT TOP 1 [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'; 

ような何かを行います多くて1つの結果(例えば、[Name]にはUNIQUEという制約があるため)です。

これを行うより適切な方法があるのだろうかと思います。例えば、C#のLINQでより表現である

var id = context.Stuff.Single()?.Name; 

ように、Single又はSingleOrDefaultあります。

答えて

2

構文が無効です。あなただけ余分になりたい場合は

DECLARE @id INT = (SELECT [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'); 

あなたは実行時エラーを取得していない余分な必ず、TOP 1を追加することができます:最大1つの行がある場合、これは動作するはずです。

注意:サブクエリは常に独自のかっこが必要です。

0

複数行の場合、このbelow-については、クエリはありません

DECLARE @id INT; 
SELECT @id = [Id] FROM [Stuff] WHERE [Stuff].[Name] = 'Harry'; 

それが良いかどうかはわからない、悪いことに、またはに遭遇することが起こったことを最終的な値を残すだろうかあなたのアイデアとの違い - ハリーがたくさんある場合はおそらく悪くなります

0

括弧についてゴードンが言ったことは同じことです。ここで、次のSQLを検討し、私のコメントの点に注意してください。

-- create table with one 'harry' 
DECLARE @stuff TABLE (id int identity, name varchar(100)); 
INSERT @stuff VALUES ('harry'); 

-- this will succeed, SQL will NOT complain 
DECLARE @id int = (SELECT id FROM @stuff WHERE name = 'harry') 

-- add another 'harry' 
INSERT @stuff VALUES ('harry'); 

-- this will fail because the subquery returns 2 rows 
DECLARE @ids int = (SELECT id FROM @stuff WHERE name = 'harry'); 

は、ORDER BY句添付ORDERせず、TOP文の結果は常に同じであることが保証されていない、ということを覚えておいてください。

0

あなたのクエリが1つのレコードのみを返すことを確信している場合、あなたが使用することができます。

DECLAREはINT

は[スタッフ] WHERE [スタッフ] FROM = [ID]を@Id SELECT @id [名前] = 'ハリー';

関連する問題