Sql server 使构建编号可排序
我有一系列内部版本号,存储为VARCHAR: BUILDID 15.40.417 16.40.11014 17.0.667 17.0.700 17.0.703 17.0.710 17.1.137 17.1.141 17.1.142 17.1.151 17.1.167 17.1.211 17.1.87 17.1.88 17.10.12 17.20.7 17.25.3 17.25.5 17.30.1Sql server 使构建编号可排序,sql-server,tsql,sorting,Sql Server,Tsql,Sorting,我有一系列内部版本号,存储为VARCHAR: BUILDID 15.40.417 16.40.11014 17.0.667 17.0.700 17.0.703 17.0.710 17.1.137 17.1.141 17.1.142 17.1.151 17.1.167 17.1.211 17.1.87 17.1.88 17.10.12 17.20.7 17.25.3 17.25.5 17.30.1 我们发现排序时不使用前导零的问题非常普遍。我想把数字分开,然后创建一个BIGINT。有没有更好的方法
我们发现排序时不使用前导零的问题非常普遍。我想把数字分开,然后创建一个BIGINT。有没有更好的方法对这些文件进行排序?我最终实现了以下功能:
-- =============================================
-- Author: Dan Andrews
-- Create date: 4/19/2017
-- Description: Converts Build IDs (17.20.1) to INTs (17020001)
-- =============================================
ALTER FUNCTION fn_BuildID2INT(@buildID VARCHAR(50))
RETURNS BIGINT
AS
BEGIN
DECLARE
@xml XML
, @value BIGINT = 10000000000
, @total BIGINT = 0;
SET @xml = CAST('<X>'+REPLACE(@buildID , '.' , '</X><X>')+'</X>' AS XML);
SELECT
@total+=C.value('.' , 'int')*@value
, @value/=100000
FROM
@xml.nodes('X') AS X(C);
RETURN @total;
END;
GO
GRANT EXECUTE ON fn_BuildID2INT TO public;
这给了我这个:
瓦尔
150004000417
160004011014
170000000667
170000000700
170000000703
170000000710
170000100137
170000100141
170000100142
170000100151
170000100167
170000100211
170000100087
170000100088
170001000012
170002000007
170002500003
170002500005
170003000001
但是。。。as,按“/”+YourColumn+“/”转换为HIERARCHYID的顺序更好。假设这很像一个标准版本号,256*256*256*左数+256*256*中间数+右数将为您提供一个32位整数。就这样吧。