2012-04-18 9 views
3

クエリ内で変数を設定/読み取ることはできますか?変数を使用したクエリ

擬似コード:

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です。 :)

+1

このクエリで何を達成しようとしていますか?言葉plzで説明してください:) – Milee

+0

よく、さまざまなタイムスタンプなどに基づいて多くの情報を収集する複雑なクエリですので、私は価格と消費率をすべてwitinから照会する必要があります。sql query soo私は同じ「サブクエリ」を複数回変数を設定して再利用することが効果的であると考えられます。 – freand

答えて

7

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

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

SELECT @YourVariable = Column 
FROM Animals 

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

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

A SELECT statement that assigns a value to a variable must not be combined with data- retrieval operations.

はこれを克服するために、単に@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であると仮定されています。

+1

はい:動作しません。 – McGarnagle

+0

すべての返信をありがとう...私はそれをテストする分を与えてください:) – freand

+0

テスト済み... "@ test varchar(10) select *、@ test = )from Transmission.dbo.users "Result ....変数に値を代入するSELECT文は、データ検索操作と組み合わせて使用​​しないでください。それはうまく動作しません。 – freand

3

いいえ、それは代わりにこのように使用可能ではありません。このような

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 

何かが動作しますが、私はあなたが探しているものについてはよく分からないです。

+0

Nah ...同じクエリ内から変数を設定して読み込む必要があります。 :( – freand

4

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

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 
+0

これは実際に私のための方法かもしれない....私は派生テーブルを読み上げる!thnx – freand

1

これは、変数に値を代入し、同じSELECT文で結果セットを返すselect文のために可能ではない - これは、SQL Serverの制限です。それが可能だったらそれは素晴らしいことではないでしょうか!

なぜここで変数を使用したいのですが、1つのステートメントが必要な場合はどうしますか?以下はあなたのために働かないでしょうか?割り当ての一つと選択のための1:

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 

注ストアドプロシージャの後の変数を使用したい場合は

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

は、その後、あなたの唯一のオプションは、2つの選択ステートメントを使用することですADOを使用する場合は、ADOコマンドで複合クエリを使用できます。つまり、コマンドコンポーネントに複数のステートメントを含めることができるため、上記の両方のソリューションが機能します。

関連する問題