3

nvarchar如何在 SQL Server 2008 Express 中创建具有数据类型的自动增量主键?我想要我的输出主键,如:

 Id        Name
 A1        AAA
 A2        BBB

谢谢

4

3 回答 3

8

您不能直接执行此操作 - 您可以执行以下操作:

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

所以尝试这样的事情:

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)
于 2013-05-28T20:51:22.043 回答
3

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

相反,添加一个intbigint自动增量 PK 并使用计算列来生成其他nvarchar列。

最后,您可以在计算列上创建非聚集索引。

于 2013-05-28T20:00:11.040 回答
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]
于 2016-02-23T17:12:41.930 回答