将单个sql server行存储在变量中,然后使用列值构造查询

时间:2012-02-07 07:09:56

标签: sql sql-server-2008

我遇到一个问题,即用户在表格中设置了他的偏好。

该表有超过5列。现在我想用preference表中的条件值搜索另一个视图。

示例:

Preference表格有price rangecolour

所以我需要搜索价格和颜色的产品。

现在我想在SQL Server本身中执行它,即传递首选项id,它将始终返回单行,然后从列中获取min pricemax price等值,然后创建一个搜索查询。

问题是我不知道如何将偏好行列值存储在变量中以便我可以使用它。

我正在使用Entity Framework,因此我也无法使用动态SQL。

我只想知道如何存储首选项表的列值。

  • 我只知道我可以这样做:

    @colour = Select Top 1 Colour from preferences;
    

但是像这样我需要为每个变量编写这个查询。是否有更好的方法称为CTE等。

2 个答案:

答案 0 :(得分:17)

您必须声明变量,然后您可以使用它们来分配SELECT中的值并稍后使用它们:

-- declare the variables
DECLARE @min_price decimal(8,2)
DECLARE @max_price decimal(8,2)
DECLARE @color varchar(20)

-- assign the values into the variables
SELECT 
    @min_price = MIN_PRICE
  , @max_price = MAX_PRICE
  , @color = Colour
FROM Preference
WHERE preference_id = (parameter of prefrence id)

-- Now you get all 3 values of Colour, Min Price, Max Price,
-- then these 3 values can be used for your query

SELECT *
FROM products 
WHERE colour = @color 
    AND price BETWEEN min_price AND @max_price

或者,如果在其他地方没有使用这3个变量,您可以进行单个查询:

SELECT *
FROM products p
INNER JOIN
(
  SELECT Colour, MIN_PRICE, MAX_PRICE
  FROM Preference
  WHERE preference_id = (parameter of prefrence id)
) pre ON (p.colour = pre.Colour AND p.price BETWEEN pre.MIN_PRICE AND pre.MAX_PRICE)

答案 1 :(得分:0)

DECLARE @A int, @B int

SELECT
  @A = Col1,
  @B = Col2
FROM SomeTable
WHERE ...

DECLARE @T TABLE (
  A int,
  B int
)
INSERT INTO @T ( A, B )
SELECT
  Col1,
  Col2
FROM SomeTable
WHERE ...