我在表中有一个select n个底部记录,并在同一行中返回一个串联值。这是代码是可以的,但不能返回n个底层记录:
SELECT
STUFF((
SELECT '; ' +
ISNULL(Val1, '') + '; ' +
ISNULL(Val2, '') + '; ' +
ISNULL(Val3, '') + '; ' +
ISNULL(Val4), '')
FROM Table_x
FOR XML PATH ('')), 1, 2, '') AS val;我编写了其他查询返回,n底部记录,但我需要在ODBC配置中使用KEPServerEX,它只支持选择和执行:
DECLARE @max_id INT
SELECT @max_id = MAX(id) FROM table_x
SET @max_id = @max_id - 20
SELECT
STUFF((
SELECT '; ' +
ISNULL(val1, '') + '; ' +
ISNULL(val2, '') + '; ' +
ISNULL(val3, '') + '; ' +
ISNULL(val4, 14), '')
FROM
(
SELECT *
FROM table_x
WHERE id > @max_id
) AS Latest_rec
FOR XML PATH ('')), 1, 2, '') AS val;我需要长话短说。例: val1; val2;val3;val4;val1;val2;val3;val4。
我使用Microsoft 2012 (SP3) - 11.0.6020.0 (X64)快捷版(64位)。但是问题是KEPServerEX,它只接受SELECT并执行。

现在,我找不到其他查询返回KEPServerEX支持的同一行中的n条底层记录。
发布于 2021-06-04 19:41:55
按id排序时,选择最后20行。按ASC顺序返回,只需一个查询
SELECT
STUFF((
SELECT '; ' +
ISNULL(val1, '') + '; ' +
ISNULL(val2, '') + '; ' +
ISNULL(val3, '') + '; ' +
ISNULL(val4, 14), '')
FROM
(
SELECT top(20) *
FROM table_x
ORDER BY id DESC
) AS Latest_rec
ORDER BY id ASC
FOR XML PATH ('')), 1, 2, '') AS val;发布于 2021-06-04 19:41:48
通过使用按id列降序排列的row_number()窗口,可以有底部n行。我已经选择了最后5行。你可以随意选择。
SELECT
STUFF((
SELECT '; ' +
ISNULL(Val1, '') + '; ' +
ISNULL(Val2, '') + '; ' +
ISNULL(Val3, '') + '; ' +
ISNULL(Val4, ''), '')
(select *, row_number()over(order by id desc) rn FROM Table_x)t
where rn=5
FOR XML PATH ('')), 1, 2, '') AS val;如果您使用的是Server 2017或更高版本,那么您可以使用string_agg(),这是非常容易使用和更快的。
SELECT string_agg(ISNULL(Val1, '') + '; ' + ISNULL(Val2, '') + '; ' + ISNULL(Val3, '') + '; ' + ISNULL(Val4,''), ';')
from (select *, row_number()over(order by id desc) rn FROM Table_x)t
where rn=5https://stackoverflow.com/questions/67842898
复制相似问题