sql-server - SQL 2014 等效于 string_agg 返回整数值
问题描述
不幸的是,该string_agg
函数直到 SQL 2017 才出现(我使用的是 2014),所以我使用XML PATH
. 它正在处理一个(致命的)缺陷——它每次都省略第RoleID
一个——第一个可见角色总是以逗号开头。
背景:我有一个表,其中安全角色存储为整数值,每行一个安全角色(称为 RoleID)。列的顺序是:UserRoleID、UserID、RoleID 等(如下表所示)。我不需要 UserRoleID,只需要 UserID 后跟以逗号分隔的 RoleID 列表。
例如,UserID 14 具有以下角色:1、2、5、6、7 和 8 在 UserRoles 表中作为单独的行。我创建的 XML 路径(抄袭 - 我不是那么好)返回以下内容——您会注意到缺少角色 1,而第二个角色 (2) 前面有一个逗号。结果应该是 1,2,5,6,7,8
结果:
UserID RoleID
14 ,2,5,6,7,8
这是SQL代码:
SELECT UserID, RoleID = STUFF((SELECT ',' + cast(UR2.RoleID as varchar(max) )
FROM dbo.UserRoles AS UR2
WHERE UR2.UserID = UR.UserID
ORDER BY RoleID
FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.UserRoles AS UR
WHERE UserID=14
GROUP BY UserID
这是 UserID 14 的原始表值:
UserRoleID UserID RoleID ExpiryDate IsTrialUsed EffectiveDate CreatedByUserID CreatedOnDate LastModifiedByUserID LastModifiedOnDate Status IsOwner
37 14 1 NULL 1 NULL 1 2020-05-20 21:55:07.387 1 2020-05-20 21:55:07.387 1 0
38 14 2 NULL 1 NULL 1 2020-05-20 21:55:07.390 1 2020-05-20 21:55:07.390 1 0
39 14 5 2020-06-30 00:00:00.000 1 NULL 1 2020-05-20 21:55:07.400 1 2020-05-20 21:55:07.400 1 0
40 14 6 2021-01-01 00:00:00.000 1 2020-05-18 00:00:00.000 1 2020-05-20 21:55:07.403 1 2020-05-20 21:55:07.403 1 0
41 14 7 NULL 1 NULL 1 2020-05-20 21:55:07.410 1 2020-05-20 21:55:07.410 1 0
51 14 8 NULL 1 NULL 1 2020-06-12 16:14:25.640 1 2020-06-12 16:14:25.640 1 0
关于如何让第一个角色按预期显示所选用户 ID 的任何建议?
解决方案
推荐阅读
- python-3.x - 如何将响应发送回发起者
- directx - DirectX 计算着色器 (HLSL):如何访问字符串中的单个字符?
- python-3.x - Pandas 无法正确解析逗号分隔的文件
- json - ruby JSON.parse ParseError 意外令牌
- python - Gensim Doc2Vec:生成的向量少于预期
- javascript - 将 Javascript 库与 parcel 一起使用会导致“ReferenceError:XXX 未定义”
- couchbase - 将计数添加到 Couchbase 中的 N1QL 查询结果
- codenameone - Codename One - transparent foreground and fonts
- python - 将使用 Cython 编译的 c 模块导入 Mac 上的 python 模块时出错
- php - 使用 the_tags() 函数将两个标签显示为列表元素