2012-04-18 2 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.

Edit:

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

Протестировано .... "declare @test varchar (10) выбрать *, @ test = (выберите верхнюю часть 1 пользователь из списка пользователей по userid desc) from Transmission.dbo.users "Результат .... Оператор SELECT, который присваивает значение переменной, не должен комбинироваться с операциями поиска данных. soo это не работает это seames – 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

Это не возможно для выбора оператора присвоения значений переменных и возвращает результирующий набор в том же ЗЕЬЕСТЕ - это ограничение 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 

Если вы хотите использовать переменные позже в хранимой процедуре, то единственным вариантом является использование двух операторов выбора: один для задания и один для выбора:

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. Другими словами, ваш компонент команды может включать более одного оператора, поэтому оба вышеупомянутых решения будут работать.

Смежные вопросы