是否可以在查询中设置/读取变量?
伪代码:
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。 :)
答案 0 :(得分:8)
是的,您可以在查询中设置变量。你的语法实际上非常接近。
为此,您需要:
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。
答案 1 :(得分: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
答案 2 :(得分:4)
不,这是不可能的,而是像这样使用:
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
这样的事情会起作用,但我不确定你在寻找什么。
答案 3 :(得分: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语句:一个用于赋值,一个用于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命令中使用复合查询。换句话说,您的命令组件可以包含多个语句,因此上述两种解决方案都可以正常工作。