【问题标题】:SET more than 1 row output into 1 variable将多于 1 行的输出设置为 1 个变量
【发布时间】:2021-08-04 21:51:24
【问题描述】:

我希望能够在单个变量中保存不止 1 个来自 SELECT 查询的输出。

目前我正在收集我需要的数据,如下所示:

DECLARE @something1 VARCHAR(MAX)
DECLARE @something2 VARCHAR(MAX)
DECLARE @something3 VARCHAR(MAX)

SET @something1 = (
  SELECT 
     Custom AS 'XXL Format' 
  FROM 
     tblData 
  WHERE 
     ID = 1);

SET @something2 = (
  SELECT 
     Custom.value('(/Individual/text())[1]', 'varchar(MAX)') AS 'Non XML Format' 
  FROM 
     tblData 
  WHERE 
     ID = 1)

SET @something3 = (
  SELECT 
     tbl1.paper, 
     tbl2.type 
  FROM 
     tblData AS tbl1 
  JOIN tblData2 tbl2 
     ON tbl1.ID = tbl2.ID 
  WHERE 
     ID = 1);

我有以下演示,显示我想要做什么

DECLARE @tester VARCHAR(MAX)

SET @tester = (
  SELECT 
     tbl1.Custom AS 'XXL Format',
     tbl1.Custom.value('(/Individual/text())[1]', 'varchar(MAX)') AS 'Non XML Format'
     tbl1.paper, 
     tbl2.type 
  FROM 
     tblData AS tbl1 
  JOIN tblData2 tbl2 
     ON tbl1.ID = tbl2.ID 
  WHERE 
     ID = 1);

我得到以下错误:

选择列表中只能指定一个表达式 EXISTS 没有引入子查询

两个演示都可以在here找到

我试图将变量设置为“表”并像这样存储数据,但这似乎也无法正常工作 [我确定我做错了什么——这可能是我这个问题的答案我问]

我怎样才能只为上述查询输出的所有内容使用 1 个变量?

【问题讨论】:

  • 如果您的期望是具有串联字符串的单个值,请考虑使用STRING_AGG 函数。
  • 请提供样本数据和期望的结果。
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql sql-server tsql variables sql-server-2016


【解决方案1】:

您的错误是子查询返回了多个值。如果您不在乎分配哪个值,则可以使用 top

SET @tester = (SELECT TOP (1) description FROM ForgeRock); 

【讨论】:

  • 我想要它输出的所有行并将它们放入那个 1 变量中。
【解决方案2】:

您只需要返回一个值,您可以尝试toplimit,例如SET @tester = (SELECT TOP 1 description FROM ForgeRock);SET @tester = (SELECT description FROM ForgeRock LIMIT 1);

【讨论】:

    【解决方案3】:

    所以我想我将变量设置为临时“表”是正确的。我终于让它满足了我的需求!

    DECLARE @tmpTbl table (_xml, _parsedXML, _paper, _type)
    
    INSERT INTO @tmpTbl 
      SELECT 
         tbl1.Custom AS 'XML Format',
         tbl1.Custom.value('(/Individual/text())[1]', 'varchar(MAX)') AS 'Non XML Format',
         tbl1.paper, 
         tbl2.type  
      FROM 
         tblData AS tbl1 
      JOIN tblData2 AS tbl2 
         ON tbl1.ID = tbl2.ID 
      WHERE 
         ID = 1;
    
    DECLARE @something1 VARCHAR(MAX) = (SELECT _xml FROM @tmpTbl);
    DECLARE @something2 VARCHAR(MAX) = (SELECT _parsedXML FROM @tmpTbl);
    DECLARE @something3 VARCHAR(MAX) = (SELECT _paper FROM @tmpTbl);
    DECLARE @something4 VARCHAR(MAX) = (SELECT _type FROM @tmpTbl);
    
    DELETE FROM @tmpTbl --Not really needed but nice to be offical :)
    

    以上将值存储到一个位置。虽然它不在 1 个变量中,但我想必须创建一个临时表对数据库/性能来说并不是那么糟糕......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2020-06-17
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多