Trigger no SQL Server

Olá.

Primeiramente, este é um post puramente sobre tsql e SQL Server.

Preciso construir uma tabela com uma chave primária especial. Segue o código da tabela:

CREATE TABLE [dbo].[pessoa]( [id] [char](7) NOT NULL PRIMARY KEY, [nome] [varchar](20) NOT NULL, [cidade] [varchar](20) NOT NULL, [idade] [tinyint] NOT NULL, [cont] [int] IDENTITY(1,1) NOT NULL )

A primary key (id) será gerada da seguinte forma: primeira letra do nome + primeira letra da cidade + idade + número identity (cont). Por exemplo, quando eu inserir (‘eduardo’, ‘araraquara’, 19) o id será ‘ea191’. Quando eu inserir um segundo registro (‘guj’, ‘java’, 20) será ‘gj202’, e por aí vai.

Nunca trabalhei com triggers. Procurando na net, descobri que isso pode ser feito com uma. Cheguei a fazer, segue o código:

[code]CREATE TRIGGER tr_insert
ON pessoa
INSTEAD OF INSERT
AS
BEGIN
DECLARE @id char(7), @nome varchar(20), @cidade varchar(20), @idade tinyint, @cont int
SET @nome = (SELECT nome FROM inserted)
SET @cidade = (SELECT cidade FROM inserted)
SET @idade = (SELECT idade FROM inserted)
SET @cont = (SELECT cont FROM inserted)
SET @id = substring(@nome, 1, 1) + substring(@cidade, 1, 1) + cast(@idade as varchar) + cast(@cont as varchar)

INSERT INTO teste (id, nome, cidade, idade) VALUES(@id, @nome, @cidade, @idade)   

END
GO [/code]

Deu quase certo. Quando eu insiro os registros acima na tabela, ele gera os seguintes IDs: ‘ea190’, ‘gj00’. Ou seja, o comando (SELECT cont FROM inserted) está me retornando 0. Isso significa que o identity é gerado depois do insert.

Alguém sabe uma forma de resolver este problema? Lembrando que não manjo de trigger, então se tiver fazendo algo de errado por favor me corrijam. Agradeço desde já.

Amigo vou tentar te dar uma luz, pq nao trabalho com sql server…

No oracle existem sequences, e você pode usar ela para gerar o id, bem o conselho que te dou é que acho que você nao precisa de trigger nesse caso, bem no oracle nao precisaria… No oracle você pode através de um select pegar o valor da sequence e ao mesmo tempo incrementar o valor no banco, ou tb pode criar uma trigger para fazer isso automaticamente…
Vou te dar um exemplo de código.

create or replace
trigger TRG_VENDEDOR_BI     before insert on "SELLCAR"."TAB_VENDEDOR"   
 for each row 
begin
  if inserting then  
   if :NEW."COD_VENDEDOR" is null then 
     select GEN_VENDEDOR.nextval into :NEW."COD_VENDEDOR" from dual; 
   end if;
  end if;
end;

Você pode pegar o valor que o select retorne e usar o seu outros id’s.

GEN_VENDEDOR é sequence, bem espero ter ajudado…

Abraços.