SQL查询,将SELECT存储在局部变量中

时间:2012-04-27 18:07:07

标签: sql-server-2005

我创建了一个重用了一些结果的查询。我搜索一种方法将结果放入变量并使用它。

一种简单的方法来查看我想要的东西 - 我希望这样:

DECLARE @result1 ?????

SET @result1 = SELECT a,b,c FROM table1
SELECT a AS val FROM @result1
UNION
SELECT b AS val FROM @result1
UNION
SELECT c AS val FROM @result1

不是这个:

 SELECT a AS val FROM (SELECT a,b,c FROM table1)
 UNION
 SELECT b AS val FROM (SELECT a,b,c FROM table1)
 UNION
 SELECT c AS val FROM (SELECT a,b,c FROM table1)

这不是我所关注的这个查询的结果,而是:

  1. 停止选择结果很多次 - 在我的样本中,我重新选择了3次表

  2. @result1的查询通常要复杂得多。因此,使用变量,代码将更清晰。

  3. 也许我想要太多 - 或者有一种局部变量。或者使用类型表并在里面设置数据。

    你有什么建议我?

    谢谢

4 个答案:

答案 0 :(得分:54)

您可以创建表变量:

DECLARE @result1 TABLE (a INT, b INT, c INT)

INSERT INTO @result1
SELECT a, b, c
FROM table1

SELECT a AS val FROM @result1
UNION
SELECT b AS val FROM @result1
UNION
SELECT c AS val FROM @result1

这应该可以满足您的需求。

答案 1 :(得分:14)

您可以采取以下其他方法。

<强> 1。联合CTE:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT a AS val FROM cte
UNION SELECT b AS val FROM cte
UNION SELECT c AS val FROM cte;

<强> 2。 CTE with unpivot:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT DISTINCT val
FROM cte
UNPIVOT (val FOR col IN (a, b, c)) u;

答案 2 :(得分:1)

当然,如果我正确理解这个问题,这不是一个更简单的解决方案。

我想将名为“spam”的表中的电子邮件地址加载到变量中。

select email from spam

生成以下列表,例如:

.accountant
.bid
.buiilldanything.com
.club
.cn
.cricket
.date
.download
.eu

加载到变量@list:

declare @list as varchar(8000)
set @list += @list (select email from spam)

@list现在可以插入表格等等。

我希望这会有所帮助。

要将它用于.csv文件或VB中,请加密代码:

declare @list as varchar(8000)
set @list += @list (select '"'+email+',"' from spam)
print @list

并生成现成的代码以供其他地方使用:

".accountant,"
".bid,"
".buiilldanything.com,"
".club,"
".cn,"
".cricket,"
".date,"
".download,"
".eu,"

一个人可以非常有创意。

由于

尼科

答案 3 :(得分:0)

我来到这里时遇到了类似的问题/问题,但是我只需要从查询中存储一个值,而不需要像orig帖子中那样存储结果的数组/表。我可以将上面的table方法用于单个值,但是我偶然发现了一种更简单的方法来存储单个值。

declare @myVal int; set @myVal = isnull((select a from table1), 0);

请确保将notull语句中的值默认为变量的有效类型,在我的示例中,我们要存储的table1中的值是一个整数。