2013-05-28 4 views

ответ

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) 
+0

спасибо вашей для вашего решения ... :) Я попробовал. – Greditasari

3

Это просто. Вы не можете. Автоинкремент работает только для числовых типов.

Вместо этого добавьте int или bigint автоинкрементного PK и использовать computed column для создания других nvarchar столбцов.

Наконец, вы можете указать create a non-clustered index на свою вычисленную колонку.

1

Другим обходным решением было бы установить значение по умолчанию для 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 

Set Default:

ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [DEFAULT_Id] DEFAULT [dbo].[fx_GetNextMyTableId]() FOR [Id] 
Смежные вопросы