我正在尝试使用FOR XML
技术连接字符串数据。结果是,我希望获得2个包含连接数据的不同列。我可以进行2次子选择来实现此目的,但是问题是我将实际使用的表非常庞大,并且对其进行2次扫描将增加很多开销。可以一次运行将这些数据加入吗?
DROP TABLE #test;
GO
CREATE TABLE #test
(
col1 VARCHAR(MAX)
, col2 VARCHAR(MAX)
);
GO
INSERT INTO #test VALUES ('1value', '2value'), ('11value', '22value');
SELECT SUBSTRING(( SELECT t.col1 + ';' AS [text()]
FROM #test AS t
FOR XML PATH(''))
, 1
, 20000) AS Note
预期结果:
| col1 | col2 |
|1value;11value | 2value;22value|
答案 0 :(得分:1)
我会尝试远离FOR XML
,因为它年代久远,在我的经验中很少使用。但是,从预期的输出来看,您希望连接来自两个不同行而不是列的字符串。这需要两个不同的数据集,因此需要两次表扫描。您至少可以通过CTE使它看起来不错吗?
WITH CTE AS (
SELECT
rownum = ROW_NUMBER() OVER (ORDER BY columns_to_order_by),
col1, col2
FROM #test
)
SELECT
cur.col1 + prev.col1, cur.col2 + prev.col2,
FROM CTE cur
INNER JOIN CTE prev on prev.rownum = cur.rownum - 1
答案 1 :(得分:0)
DROP TABLE #test;
GO
CREATE TABLE #test
(
col1 VARCHAR(MAX)
, col2 VARCHAR(MAX)
);
GO
INSERT INTO #test VALUES ('1value', '2value'), ('11value', '22value');
SELECT STUFF(( SELECT ';' + t.col1 AS [text()]
FROM #test AS t
FOR XML PATH(''))
, 1
,1
, '') AS Note,
STUFF(( SELECT ';' + t.col2 AS [text()]
FROM #test AS t
FOR XML PATH(''))
, 1
,1
, '') AS Note2
-第二种方式
DECLARE @ Col1 VARCHAR(最大值) 十进制@ Col2 VARCHAR(MAX)
选择@ Col1 = COALESCE(@ Col1 +';','')+ t.col1 ,@ Col2 = COALESCE(@ Col2 +';','')+ t.col2 从#test AS t
选择@ Col1,@ Col2