77

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

一种简单的方法来查看我想要的东西看起来像这样 - 我想要这个:

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通常要复杂得多。因此,使用变量,代码会更清晰。

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

你有什么建议?

谢谢

4

4 回答 4

96

您可以创建表变量:

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

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

于 2012-04-27T18:11:06.307 回答
21

以下是您可以采取的其他一些方法。

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. 带 unpivot 的 CTE:

;WITH cte AS (SELECT a, b, c FROM table1)
SELECT DISTINCT val
FROM cte
UNPIVOT (val FOR col IN (a, b, c)) u;
于 2012-04-27T19:24:06.413 回答
6

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

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

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,"

一个人可以很有创意。

谢谢

尼科

于 2016-04-26T16:40:42.953 回答
2

我带着类似的问题/问题来到这里,但我只需要从查询中存储一个值,而不是原始帖子中的结果数组/表。我能够将上面的表格方法用于单个值,但是我偶然发现了一种更简单的方法来存储单个值。

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

确保将 isnull 语句中的值默认为变量的有效类型,在我的示例中,我们存储的 table1 中的值是 int。

于 2018-11-27T20:50:36.540 回答