【问题标题】:SQL query, store result of SELECT in local variableSQL查询,将SELECT的结果存储在局部变量中
【发布时间】:2012-04-27 18:07:07
【问题描述】:

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

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

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 的查询通常要复杂得多。所以,有了变量,代码会更干净。

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

你有什么建议?

谢谢

【问题讨论】:

    标签: sql-server-2005


    【解决方案1】:

    您可以创建表变量:

    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
    

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

    【讨论】:

    • 是的,我认为我应该这样做。我只是发布它以了解是否有其他方法。坦克你。
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 与 cte 似乎很有趣。不需要创建每一行的表。坦克你
    • @AnthonyFaull 感谢您的回答。但是,in(statement) 声明怎么样?
    【解决方案3】:

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

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

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

    一个人可以很有创意。

    谢谢

    尼哥

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      猜你喜欢
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多