有没有办法计算SQL Server视图的所有列的哈希值?

时间:2017-08-11 04:32:26

标签: sql sql-server sql-server-2012

我有一个SQL Server 2012视图,其中有大约12列,其中一些是数字,一些是字符串,另一些是DateTime,我需要添加第13列,如同所有这些的哈希,目前我只是在做以下

column1 +  '|' + column2 +  '|' column3 

等等,这很乏味,需要我将所有非varchar列转换为varchar并进行此连接。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用CHECKSUM将值散列为计算列中的INT:

CREATE TABLE T1 (C1 VARCHAR(10), C2 VARCHAR(10), C3 INT, C4 DATETIME, 
C5 AS CHECKSUM(C1, C2, C3, C4))

INSERT INTO T1 VALUES ('Value 1', 'Col2 Val 1', 100, getdate() - 100)
INSERT INTO T1 VALUES ('Value 2', 'Col2 Val 2', 200, getdate() - 80)
INSERT INTO T1 VALUES ('Value 3', 'Col2 Val 3', 300, getdate() - 60)
INSERT INTO T1 VALUES ('Value 4', 'Col2 Val 4', 400, getdate() - 40)
INSERT INTO T1 VALUES ('Value 5', 'Col2 Val 5', 500, getdate() - 20)

C5收益率:

C5
-1870891995
-1870901775
-1870904739
-1870874967
-1870880267

如果你需要它是一个可读的哈希,你可以将哈希写成计算列 - 这样,你只需要写一次:

CREATE TABLE T1 (C1 VARCHAR(10), C2 VARCHAR(10), C3 INT, C4 DATETIME, 
C5 AS C1 + '|' + C2 + '|' + CAST(C3 AS VARCHAR(10)) + '|' + FORMAT(C4, 'M/d/yyyy'))

INSERT INTO T1 VALUES ('Value 1', 'Col2 Val 1', 100, getdate() - 100)
INSERT INTO T1 VALUES ('Value 2', 'Col2 Val 2', 200, getdate() - 80)
INSERT INTO T1 VALUES ('Value 3', 'Col2 Val 3', 300, getdate() - 60)
INSERT INTO T1 VALUES ('Value 4', 'Col2 Val 4', 400, getdate() - 40)
INSERT INTO T1 VALUES ('Value 5', 'Col2 Val 5', 500, getdate() - 20)

SELECT * FROM T1

C5
Value 1|Col2 Val 1|100|5/2/2017
Value 2|Col2 Val 2|200|5/22/2017
Value 3|Col2 Val 3|300|6/11/2017
Value 4|Col2 Val 4|400|7/1/2017
Value 5|Col2 Val 5|500|7/21/2017