我创建了一个重用了一些结果的查询。我搜索一种方法将结果放入变量并使用它。
一种简单的方法来查看我想要的东西 - 我希望这样:
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)
这不是我所关注的这个查询的结果,而是:
停止选择结果很多次 - 在我的样本中,我重新选择了3次表
@result1
的查询通常要复杂得多。因此,使用变量,代码将更清晰。
也许我想要太多 - 或者有一种局部变量。或者使用类型表并在里面设置数据。
你有什么建议我?
谢谢
答案 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中的值是一个整数。