【发布时间】:2020-04-06 19:19:49
【问题描述】:
我有一个带有嵌套选择的查询。我在 SQL Server 2017 中编写了此查询,现在我必须将其转换为在 SQL Server 2014 中使用。我知道STRING_AGG 必须转换为FOR XML PATH 和STUFF,我尝试了某种类型的查询,但我不能找到答案。
SQL Server 2017 中的原始工作查询是:
SELECT filesanadrow, STRING_AGG(CONVERT(nvarchar(MAX),result.tarafhesabsharh), ' ; ') AS tarafhesabha
FROM (SELECT DISTINCT k.row AS filesanadrow, CONVERT(NVARCHAR(MAX), t.tarafhesabsharh) AS tarafhesabsharh
FROM filesanad AS k INNER JOIN tarafhesab AS t ON k.row = t.filesanadrow) AS result
GROUP BY filesanadrow
然后STRING_AGG(CONVERT(nvarchar(MAX),result.tarafhesabsharh), ' ; ') 必须转换为 FOR XML PATH 和 STUFF。
我试过这段代码:
SELECT filesanadrow,
STUFF((SELECT distinct '' + t2.tarafhesabsharh
from result t2 where t1.filesanadrow = t2.filesanadrow
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,0,'') AS tarafhesabha
FROM (SELECT DISTINCT k.row AS filesanadrow, CONVERT(NVARCHAR(MAX), t.tarafhesabsharh) AS tarafhesabsharh
FROM filesanad AS k INNER JOIN tarafhesab AS t ON k.row = t.filesanadrow) AS result
GROUP BY filesanadrow
但是 SQL Server 返回:
(无效的对象名'result'。SQL2.sql 3 1)
我也试过了:
SELECT filesanadrow,
STUFF((SELECT '; ' + name FROM result FOR XML PATH('')), 1, 1, '') AS tarafhesabha
FROM (SELECT DISTINCT k.row AS filesanadrow, CONVERT(NVARCHAR(MAX), t.tarafhesabsharh) AS tarafhesabsharh
FROM filesanad AS k INNER JOIN tarafhesab AS t ON k.row = t.filesanadrow) AS result
GROUP BY filesanadrow
但是 SQL Server 返回:
对象名称“结果”无效。 SQL2.sql 2 1
我又试了一次:
SELECT filesanadrow,
STUFF((SELECT '; ' + tarafhesabsharh FROM tarafhesab FOR XML PATH('')), 1, 1, '') AS tarafhesabha
FROM (SELECT DISTINCT k.row AS filesanadrow, CONVERT(NVARCHAR(MAX), t.tarafhesabsharh) AS tarafhesabsharh
FROM filesanad AS k INNER JOIN tarafhesab AS t ON k.row = t.filesanadrow) AS result
GROUP BY filesanadrow
但 SQL Server 会使用此代码不停地运行。
如何转换该查询?
【问题讨论】:
-
创建一个 UFD 并使用该 UDF。有很多个重复的问题展示了如何做到这一点。更快更简洁的选择是使用 SQLCLR UDF 而不是 XML PATH 方法
-
@PanagiotisKanavos 什么是 UFD? (唯一分解域)???
-
@bsflasher 在数据库上下文中:User Defined Function.
标签: sql sql-server