我正在尝试为SQL Server 2012编写SQL查询,该查询将返回varbinary值,其中值中的位表示对系统中特定模块的权限。因此,例如,如果我有权访问模块1,4和10,查询将返回0x0209(位1,4和10打开)
我有一个查询,它会在一个单独的行中返回二进制值的每个字节(请记住,这是一个返回一些特定值的查询,仅用于测试逻辑):
SELECT CONVERT(varchar(5), CONVERT(varbinary(1), SUM(POWER(2, ((ModuleID-1)%8)))),2) AS ByteMask
, (ModuleID-1) / 8 AS ByteNumber
FROM Gideon.Permission
WHERE IsBaseModulePermission = 1
AND ModuleID <> 3
AND ModuleID <> 8
GROUP BY (ModuleID-1) / 8
返回:
ByteMask ByteNumber
'7B' 1
'FF' 2
'01' 3
ByteMask是一个VarChar,我需要将它们组合成ByteNumber DESC的字符串排序。结果将是01FF7B。然后我将此字符串转换为varbinary。我有一个用户定义的聚合函数Concat,它将为我连接字符串。所以查询
SELECT dbo.Concat(DrvTable.ByteMask, '') AS ByteString
FROM (
SELECT CONVERT(varchar(5), CONVERT(varbinary(1), SUM(POWER(2, ((ModuleID-1)%8)))),2) AS ByteMask
, (ModuleID-1) / 8 AS ByteNumber
FROM Gideon.Permission
WHERE IsBaseModulePermission = 1
AND ModuleID <> 3
AND ModuleID <> 8
GROUP BY (ModuleID-1) / 8
) AS DrvTable
将返回&#39; 7BFF01&#39;
的VarChar这是我被卡住的地方。需要返回的值是&#39; 01FF7B&#39;。 ByteMask字符串的串联需要由ByteNumber DESC排序。在派生表上放置TOP 100 PERCENT和ORDER BY对结果没有影响。您不能在用户定义的聚合函数上使用OVER子句。
所以,我希望有人能够以完全不同的方式实现这一目标,或者能够告诉我如何从派生表中获取按特定顺序传递给Concat聚合函数的行。 / p>