Sql server 带文本的SQLServer标识列

Sql server 带文本的SQLServer标识列,sql-server,identity,Sql Server,Identity,如何在SQLServer中创建包含列中文本的标识列 例如: ABCD-987065 ABCD-987066 ABCD-987067 ABCD-987065 ABCD-987066 ABCD-987067 不可以。实际的列类型必须是int或bigint。不可以,抱歉。标识“属性”只能放在整数或十进制数据类型的列上。否,但您可以创建Select语句,以返回所需的代码: Select 'ABCD-' + Cast(IdColumn as varchar) as IdColumn From MyTabl

如何在SQLServer中创建包含列中文本的标识列

例如:

ABCD-987065 ABCD-987066 ABCD-987067 ABCD-987065 ABCD-987066 ABCD-987067
不可以。实际的列类型必须是int或bigint。不可以,抱歉。标识“属性”只能放在整数或十进制数据类型的列上。

否,但您可以创建Select语句,以返回所需的代码:

Select 'ABCD-' + Cast(IdColumn as varchar) as IdColumn From MyTable Where (....);
这假定您的表中有一个名为IdColumn的列,并且“IDENTITY”属性已设置为“true”。也就是说,高亮显示SQLServerManagementStudio的表设计器中的字段,您将在底部看到一个属性窗口

如果“ABCD”部分可能会更改,您可以将此值放在另一个字段中,然后按如下方式检索:

Select PrefixField + '-' + Cast(IdColumn as varchar) as IdColumn From MyTable Where (....);

当然,您可以创建一个视图来执行此操作,甚至还可以创建一个计算字段。这样,返回值内置于查询中,您不必每次都记住输入所有这些内容。

您不必使用标识列,而是自己生成ID/字符串

相反,设置标识列的格式以供显示要好得多,特别是当字符串部分对于所有记录都是常量时,这会提高索引/查询的性能,并节省数据库空间


如果记录可能有不同的字符串部分(即并非全部以“ABCD-”开头),则可以将其存储为单独的字段。

除了其他答案外,还可以在表上创建一个字段,以提供所需内容

CREATE TABLE dbo.MyTable
(
    Id int NOT NULL PRIMARY KEY,
    CombinedId AS 'ABCD-' + CAST(Id as varchar(16)) 
)
或:


(您的问题没有说明前缀是否是固定的…

您可以使用如下函数增加字符串值:


不过,我很好奇,为什么您希望使用字母数字键而不仅仅是数字键。

在这里检查答案


谢谢。你愿意详细说明一下如何创建这样一个专栏吗。或者提供您所说内容的参考资料?谢谢。你愿意详细说明一下如何创建这样一个专栏吗。或者提供您所述内容的参考?这完全取决于他们所需主键值的性质——也就是说,他们希望输入什么作为“ABCD”,以及为什么,以及如何确定,以及。。。这导致了一系列的设计问题,由于昨天是工作繁忙的一天,我决定不再跟进。(好的,这也是一个简单的答案,这次我要的是快速而不是良好/稳健的回答。)也就是说,假设
ABCD
部分也不会自动递增(但我假设它会自动递增)。Codesleuth-如何“ABCD”递增?你以为这是个十六进制数吗?有了破折号,我想这是一个固定的前缀。不过,为了处理prefix.roygbiv中的更改,我已经更改了答案-您需要对整数字段进行强制转换,因此我更新了我的答案。哦,天哪!我怎么敢提出一个解决方案并匿名被否决(就像这里的其他人一样)。我看不出有理由否决你,你的答案与这个问题有关。有些人我不知道他们是怎么想的。回到正常状态组合Id中包含的列是否需要位于
combinedId
列的前面?
CREATE TABLE dbo.MyTable
(
    Id int NOT NULL PRIMARY KEY,
    PrefixField varchar(16),
    CombinedId AS PrefixField + CAST(Id as varchar(16)) 
)
CREATE TABLE BikeParts (
    BikeParts_GUID AS 'ABCD-' + RIGHT(REPLICATE('0', 8) + CONVERT(VARCHAR, BikePart_ID), 10),
    BikePart_ID INT IDENTITY(1, 1),
    BikePart_Name VARCHAR(100)
)

INSERT INTO BikeParts VALUES ('Break Cable')
INSERT INTO BikeParts VALUES ('Seat Cover')
INSERT INTO BikeParts VALUES ('Head Light')
INSERT INTO BikeParts VALUES ('Tail Lamp')

SELECT * FROM BikeParts