我有一个SQL Server 2012视图,其中有大约12列,其中一些是数字,一些是字符串,另一些是DateTime
,我需要添加第13列,如同所有这些的哈希,目前我只是在做以下
column1 + '|' + column2 + '|' column3
等等,这很乏味,需要我将所有非varchar列转换为varchar
并进行此连接。
有更好的方法吗?
答案 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