2017-08-11 56 views
0

我有一个SQL Server 2012视图,它有大约12列,其中一些是数字,一些是字符串,另一些是DateTime,我需要添加第13列,就像所有这些哈希,目前我我只是做了以下有没有办法为SQL Server视图的所有列计算散列?

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

等,它是乏味的,要求我投所有非VARCHAR列于varchar并做串联。

有没有更好的方法来做到这一点?

回答

1

你可以使用校验和散列值到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 
+0

我现在真的这样做,想知道如果有我更好的方法来做同样的事情。 – Krylor

+0

嗯...... CHECKSUM呢? –

+0

我认为如果输出对于一个独特的组合是唯一的,那么它应该可以工作。 – Krylor

相关问题