9

クエリ内から変数を設定/読み取ることは可能ですか?

擬似コード:

SELECT animal_name,
    @tallest_animal = (select top 1 height from animal order by height desc) as tallest,
    @smallest_animal = (select top 1 height from  animal order by height asc) as smallest
FROM animals
WHERE height BETWEEN @smallest_animal AND @tallest_animal

クエリを異なるものにすることで結果が得られることはわかっていますが、私の質問の実際の使用法は説明が難しすぎます。

問題の Microsoft SQL Server です。:)

4

4 に答える 4

9

はい、クエリ内で変数を設定できます。あなたの構文は実際にはかなり近いです。

そのためには、次のものが必要です。

SELECT @YourVariable = Column
FROM Animals

注: フィールドを変数に割り当てる場合、AS は使用できません。

クエリ内のすべてのフィールドが変数に割り当てられていることを確認する必要があります。そうしないと、次のエラーが発生します。

変数に値を代入する SELECT ステートメントは、データ取得操作と組み合わせてはなりません。

これを克服するには、AnimalName を @AnimalName 変数に割り当てるだけです。

編集:

DECLARE @AnimalName  VARCHAR(20)
DECLARE @TallestAnimal  INT
DECLARE @SmallestAnimal INT

SELECT @AnimalName = animal_name,
   @TallestAnimal  = (select top 1 height from animal order by height desc),
   @SmallestAnimal = (select top 1 height from  animal order by height asc) 
FROM animals
WHERE height BETWEEN @SmallestAnimal AND @TallestAnimal 

このコードは、高さフィールドが INT 型であると想定しています。

于 2012-04-18T09:19:22.897 に答える
7

いいえ、できません。代わりに次のように使用します。

DECLARE @tallest_animal int, @smallest_animal int
SET @tallest_animal=(SELECT max(height) from animals)
SET @smallest_animal=(SELECT min(height) from animals)
SELECT animal_name from animals where height between @tallest_animal AND @smallest_animal

このようなものは機能しますが、何を探しているのかわかりません。

于 2012-04-18T09:22:01.657 に答える
5

変数の代わりに派生テーブルを使用できます。

select A.animal_name, M.tallest, M.smallest
from animals A
  inner join 
      (
        select max(height) as tallest,
               min(height) as smallest
        from animal
      ) M
    on A.height between M.smallest and M.tallest
于 2012-04-18T09:55:47.197 に答える
1

It is not possible for a select statement to assign values to variables and return a resultset in the same SELECT statement - this is a restriction of SQL Server. Wouldn't it be great if it were possible!

Why do you wish to use variables here, if you're requiring a single statement? Would the following not work for you?

WITH cte (tallest, smallest) AS (
    SELECT MAX(height), MIN(height) FROM animals
)
SELECT animal_name FROM animals, cte WHERE height BETWEEN smallest AND tallest

If you wish to use the variables later on in a stored procedure, then your only option is to use two select statements: One for the assignment and one for the select:

DECLARE @tallest INT, @smallest INT
SELECT @tallest = MAX(height), @smallest = MIN(height) FROM animals
SELECT animal_name FROM animals WHERE height BETWEEN @smallest AND @tallest

Note that when using ADO, you can use compound queries in an ADO command. In other words, your command component can include more than one statement, so both of the above solutions would work.

于 2012-04-18T10:33:59.987 に答える