Автоинкремент значений с буквенно-цифровой - PullRequest
0 голосов
/ 31 октября 2010


Я пытаюсь автоматически увеличить буквенно-цифровое поле (скажем, для productid в таблице product).

Но я получаю сообщение об ошибке (см. Ниже).Может кто-нибудь, пожалуйста, посмотрите на эту ошибку или любой другой подход к решению этой задачи?

Детали моей таблицы:

create table tblProduct
(
 id varchar(15)
)

create procedure spInsertInProduct
AS
Begin
  DECLARE @PId VARCHAR(15)
  DECLARE @NId INT
  DECLARE @COUNTER INT
  SET @PId = 'PRD00'
  SET @COUNTER = 0
  --This give u max numeric id from the alphanumeric id
  SELECT @NId = cast(substring(id, 3, len(id)) as int) FROM tblProduct group by left(id, 2) order by id
  --here u increse the vlaue to numeric id by 1
  SET @NId = @NId + 1
  --GENERATE ACTUAL APHANUMERIC ID HERE
  SET @PId = @PId + cast(@NId AS VARCHAR)
  INSERT INTO tblProduct(id)values (@PId)
END

Я получаю следующую ошибку:

Сообщение 8120, уровень 16, состояние 1, процедура spInsertInProduct, строка 10 Столбец «tblProduct.id» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.Сообщение 8120, уровень 16, состояние 1, процедура spInsertInProduct, строка 10 Столбец «tblProduct.id» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY. **

Ответы [ 3 ]

0 голосов
/ 31 октября 2010
 SELECT @NId = max(
                    cast(substring(id, 4, len(id)) as int)
                  ) 
FROM tblProduct;

Предполагается, что ваша функция подстроки возвращает числовую часть вашего идентификатора.Я внес изменения, поскольку в других примерах ваш идентификатор начинается с PRD.

Примечание: нет никаких причин, чтобы ваш идентификатор продукта начинался с PRD в базе данных.Если бы это было поле идентификатора, вы могли бы установить его с приращением на 1, и на любом дисплее просто иметь: «PRD» + Cast (ID как varchar25)) как ProductID.Может быть, это не так просто, все идентификаторы не начинаются с тех же трех букв.

0 голосов
/ 31 октября 2010

Я проверил вашу хранимую процедуру в SQL Server 2000 и Query Analyzer, она работает очень хорошо. Только что я удалил код создания таблицы из этого.

0 голосов
/ 31 октября 2010

Ваша линия

SELECT @NId = cast(substring(id, 3, len(id)) as int)
  FROM tblProduct
  group by left(id, 2)
  order by id

не делает то, что вы хотели. Это терпит неудачу, потому что вы не можете включить id в выборку напрямую, потому что вы группируете по левому (id, 2), а не по самому id. Нельзя помещать что-либо в оператор выбора при группировании, если оно не является частью Group By или агрегатом (таким как SUM и MAX.)

(Edit: Corrected, Left и Substring не основаны на 0 - чтобы получить тег PRD и тому подобное, нам нужна подстрока 4, а left 3.)

Правильный способ сделать это будет:

SELECT @NId = cast(substring(MAX(id), 4, len(MAX(id))) as int) 
  FROM tblProduct
  group by left(id, 3)
  order by left(id, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...