首页 > 解决方案 > 将多于 1 行的输出设置为 1 个变量

问题描述

我希望能够在单个变量中保存不止 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 引入子查询时,选择列表中只能指定一个表达式

两个演示都可以在这里找到

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

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

标签: sqlsql-servertsqlvariablessql-server-2016

解决方案


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

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 个变量中,但我想必须创建一个临时表对数据库/性能来说并不是那么糟糕......


推荐阅读