2012-04-18 191 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 2012-04-18 09:23:25

+0

以及它的一個複雜的查詢,收集了很多基於不同的時間戳等信息,所以我需要通過一個SQL查詢來計算所有的價格和消費率洙我結束了多次製作相同的「subquerys」一個想法是設置一個變量並重新使用它。 – freand 2012-04-18 10:14:05

回答

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 2012-04-18 09:27:43

+0

感謝所有回覆...給我一分鐘來測試:) – freand 2012-04-18 10:04:36

+0

測試....「declare @test varchar(10) select *,@ test =(從用戶中選擇top 1用戶標識)來自Transmission.dbo.users「結果....將值賦給變量的SELECT語句不能與數據檢索操作結合使用。噓它不工作它seames – freand 2012-04-18 10:09:55

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

那......我需要在同一個查詢中設置和讀取一個變量。 :( – freand 2012-04-18 10:11:23

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 2012-04-18 10:20:48

1

這是不可能的SELECT語句賦值給變量,並在同一個SELECT語句返回一個結果 - 這是SQL Server的一個限制。如果可能的話,會不會很棒!

爲什麼你希望在這裏使用變量,如果你需要一個單一的陳述?以下不適合你嗎?

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

如果你想在存儲過程以後使用的變量,那麼你唯一的選擇是使用兩個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 

注在使用ADO時,可以在ADO命令中使用複合查詢。換句話說,你的命令組件可以包含多個語句,所以上述兩種解決方案都可以工作。