在sql中的identity列中存储十六进制等效项

时间:2012-10-01 17:52:20

标签: sql-server sql-server-2008 tsql hex sql-server-2012

正如标题所说,如果我有一个表有这样的结构

create table myTable
(
ID int identity(1,1) not null,
col1 varchar(20) not null,
col2 varchar(20) not null
constraint pk_myTable primary key (ID)
)

如果我在此表中插入一些值,它将自动在col ID中取值。我想知道是一种可以让SQL Server在列中存储十六进制等效项的方法。比方说,对于1,它应该存储0x01 2 as 0x02 ... 10 as 0xA等等?

我不想知道任何技巧或其他东西,我知道我可以创建这个col作为varchar,然后创建一个插入过程,或创建一个插入触发器,它将执行所需的转换和会产生预期的结果,是个大问题。

但是我想知道的是有一个内置的函数/过程/触发器可以帮助我实现我想要实现的目标吗?不一定在SQL Server 2008中,但可能在2012年,是否存在类似的内容?

1 个答案:

答案 0 :(得分:2)

我同意Joe Stefanelli和Habo的说法,你不需要这样做。这说明该技术在其他场景中很有用。

像这样定义你的表(注意计算列)

CREATE TABLE mytable( 
ID int identity(1,1) not null, 
col1 varchar(20) not null, 
col2 varchar(20) not null,
ComputedHexColumn AS CONVERT(VARBINARY(8), ID),
CONSTRAINT pk_myTable PRIMARY KEY CLUSTERED(ID) 
) 

然后填充它

INSERT INTO mytable(col1,col2) 
SELECT 'col1 - 1','col2 - 1'
UNION SELECT 'col1 - 2','col2 - 2'
UNION SELECT 'col1 - 3','col2 - 3'
UNION SELECT 'col1 - 4','col2 - 4'

然后,只要您从表中选择,它就会包含十六进制值

SELECT * FROM mytable

image showing results complete with computed column

如果计算值的计算成本要高得多,那么您可以将该列标记为PERSISTED。然后,数据库将物理存储该值并在适当时更新它。