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

我创建了一个具有重用结果的查询。我寻找一种方法将结果放入一个变量中并使用它。

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

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的查询通常要复杂得多。因此,使用一个变量,代码会更简洁。

也许我想多-或者有一个局部变量的类型。或者使用类型表并在其中设置数据。

你有什么建议?

谢谢你

223840 次浏览

可以创建表变量:

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. 与工会合作的创伤性脑病:

;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. 不转轴的慢性创伤性脑病:

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

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

我想加载电子邮件地址在一个表中称为“垃圾邮件”到一个变量。

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

一个人可以很有创造力。

谢谢

尼科

我来这里也有一个类似的问题/问题,但是我只需要从查询中存储一个值,而不是像在 orig post 中那样存储一个结果数组/表。我能够对单个值使用上面的表方法,但是我偶然发现了一种更容易的方法来存储单个值。

Declare@myVal int; Set@myVal = isnull ((从表1中选择 a) ,0) ;

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