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

选择语句不可能为变量赋值并在同一个 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

如果您希望稍后在存储过程中使用变量,那么您唯一的选择是使用两个选择语句:一个用于赋值,一个用于选择:

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 命令中使用复合查询。换句话说,您的命令组件可以包含多个语句,因此上述两种解决方案都可以工作。

于 2012-04-18T10:33:59.987 回答