我有下面的脚本。它只会打印出一个值,而不能全部打印出来。
Pot
ABC
MPOT
NVPN
PLGG
但是,当我删除按个案排序的部分时,它将打印所有值。这是为什么?在这里不可能使用自定义订单吗?
declare @pot nvarchar(max) = ''
select @pot = @pot + QUOTENAME(pot) + ','
from myTbl
group by pot
order by case when pot = 'MPot' then '1'
else pot end
print(@pot)
答案 0 :(得分:5)
如果您要创建带分隔符的列表,则有“更好”的方法。如果您使用的是2017年以上的版本,则可以使用STRING_AGG
:
CREATE TABLE dbo.myTbl (Pot varchar(4));
INSERT INTO dbo.myTbl (Pot)
VALUES('ABC'),
('MPOT'),
('NVPN'),
('PLGG');
GO
DECLARE @Pot nvarchar(MAX)
SET @Pot = (SELECT STRING_AGG(QUOTENAME(Pot), ',') WITHIN GROUP (ORDER BY CASE WHEN Pot = 'MPot' THEN '1' ELSE Pot END) FROM dbo.myTbl);
PRINT @Pot;
如果您使用的是2016-,则可以使用FOR XML PATH
:
DECLARE @Pot nvarchar(MAX);
SET @Pot = STUFF((SELECT ',' + QUOTENAME(Pot)
FROM dbo.myTbl
ORDER BY CASE WHEN Pot = 'MPot' THEN '1' ELSE Pot END
FOR XML PATH(N''), TYPE).value('.', 'nvarchar(MAX)'),1,1,'');
答案 1 :(得分:1)
我只能想象您正在尝试按确定的顺序连接这些值。我建议:
declare @pot nvarchar(max) = '';
select @pot = string_agg( pot, ',') within group (order by case when pot = 'MPot' then '1' else pot end)
from (select distinct pot from myTbl) t;
print @pot;
答案 2 :(得分:0)
这是我的解决方法
declare @mytbl as table(pot nvarchar(max),n int)
insert into @mytbl values('',0),('ABC',0),('MPOT',-1),('NVPN',0),('PLGG',0)
declare @pot nvarchar(max) = ''
select @pot = @pot + QUOTENAME(pot) + ','
from @mytbl
group by pot,n
order by n--case when pot = 'MPot' then '1'else pot end
print(@pot)