如何在nvarchar的sql server中添加自动增量主键?

时间:2013-05-28 19:56:39

标签: sql-server sql-server-2008 sqldatatypes

如何在SQL Server 2008 Express中使用nvarchar数据类型自动增加主键?我想要输出主键,如:

 Id        Name
 A1        AAA
 A2        BBB

谢谢

3 个答案:

答案 0 :(得分:7)

你不能直接这样做 - 可以做的是:

  • 创建一个自动增量列来处理数字部分
  • 添加一个计算列,用于连接字符串前缀和数字

所以尝试这样的事情:

CREATE TABLE dbo.YourTable
    (ID INT IDENTITY(1,1) NOT NULL,
     StringPrefix NVARCHAR(10) NOT NULL,
     IDandPrefix AS ISNULL(StringPrefix + CAST(ID AS NVARCHAR(10)), 'X') PERSISTED
    )

现在插入如下行:

INSERT INTO dbo.YourTable(StringPrefix) VALUES('A'), ('B'), ('A')

你应该得到这样的行:

ID   StringPrefix   IDandPrefix
 1        A             A1
 2        B             B2
 3        A             A3

您也可以在IDandPrefix列上定义主键:

ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED (IDandPrefix)

答案 1 :(得分:3)

这很简单。你不能。自动增量仅适用于数字类型。

相反,添加intbigint自动增量PK并使用computed column生成其他nvarchar列。

最后,您可以在计算列上create a non-clustered index

答案 2 :(得分:2)

另一种解决方法是将Id的默认值设置为可以派生下一个值的函数。

功能(SQL Server 2008):

        CREATE FUNCTION [dbo].[fx_GetNextMyTableId] ()
        RETURNS varchar(50)
        AS
        BEGIN
            DECLARE @NextId varchar(50), @IdCount int, @Prefix varchar(25), @NumberOfSuffixDigits tinyint
            Set @Prefix = 'A'
            Set @NumberOfSuffixDigits = 1

            SELECT @IdCount = count(*) FROM dbo.MyTable
            SET @NextId = @Prefix + REPLICATE('0', @NumberOfSuffixDigits - LEN(@IdCount + 1)) + CAST (@IdCount + 1 AS varchar)

            RETURN (@NextId)
        END

功能(SQL Server 2012):

        CREATE FUNCTION [dbo].[fx_GetNextMyTableId] ()
        RETURNS varchar(50)
        AS
        BEGIN
            DECLARE @NextId varchar(50), @IdCount int, @Prefix varchar(25), @NumberOfSuffixDigits tinyint
            Set @Prefix = 'A'
            Set @NumberOfSuffixDigits = 1

            SELECT @IdCount = count(*) FROM dbo.MyTable
            SET @NextId = @Prefix + FORMAT(@IdCount + 1, REPLICATE('0', @NumberOfSuffixDigits))

            RETURN (@NextId)
        END

设置默认值:

ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DEFAULT_Id] DEFAULT [dbo].[fx_GetNextMyTableId]() FOR [Id]